From 193a3a34755c9fb882823e26e9b4cc6f746fb6f3 Mon Sep 17 00:00:00 2001 From: Sol Lee Date: Wed, 22 Dec 2021 17:22:05 +0800 Subject: [PATCH 01/77] Add zh_Hant_TW translations --- .../LC_MESSAGES/ckanext-showcase.mo | Bin 0 -> 8355 bytes .../LC_MESSAGES/ckanext-showcase.po | 524 ++++++++++++++++++ 2 files changed, 524 insertions(+) create mode 100644 ckanext/showcase/i18n/zh_Hant_TW/LC_MESSAGES/ckanext-showcase.mo create mode 100644 ckanext/showcase/i18n/zh_Hant_TW/LC_MESSAGES/ckanext-showcase.po diff --git a/ckanext/showcase/i18n/zh_Hant_TW/LC_MESSAGES/ckanext-showcase.mo b/ckanext/showcase/i18n/zh_Hant_TW/LC_MESSAGES/ckanext-showcase.mo new file mode 100644 index 0000000000000000000000000000000000000000..2465e7d6a9423e06fdd99e4a4f633dd3bd0ab71a GIT binary patch literal 8355 zcma)qwALBv%kInW!`=6`@4Zck zn9lM$7$7N-2qYjN#Ekq3q7af0I-TjXGydqb{m(z_IPQCIcgEJvbm~+)!}NRJyYKDW zO^`a0&)$2_J@?#m&pG$LPj0-bi{U>F|L(-UT~|`8^xt(?Gd2OuiJ%GI3Vs{h27Vvh z30?=j30?yZfIk4wiSdsFKLH;_|3APe_yB|#f-eXj1n)AQ@554>IQevsCi z3Eluc0YVk~g=jZ`n95A>0k9REcm-qqAlY*Uo45^pA0+)2crExjNc;H@coldNoCsct zLE;S{t#c1Z^Cp83VNo&u2uOA=1Zn-}K$2St-V8Q^WOpk_a@$0^7rY(qW8jV8A3zR% z4Bi9&7li5T4mg+Wm;{pFrh{ZpgWxKVp9+2p zlP9BnA4ubi!75M(X@75m9Q+GN=khObG58fop;>pmH@*lYKdl1q178CveougRf$xKu z!iu14pXk2`-jDt}5kwq(9HetgfH0k9z#oFY2FY)`Kulr%;4R=e@WI}`fq>{w2xZ_ zCxNuiG?3z>4y5&868%ZhUIWs(ZUp}X9tZCRTQTWguooo#qk_K|{6O%pAg%K;NbCPy z^nWdQ1(KKY?i!HBZxZAn>5T}^0Lc%Jg5;OyL8xE}!5m2I>;cJ7$3TjQ-+?smbCC9T z4GxX;-U!n8Z6Ni}7hEdFpBH=yqx* z1v5Zew*!0v>=y06iE$ewJHLfLB!92qERgzNz#sDOYLNWZ4w8LcAo=mEXn!ikuS61) z{6r8T!#GI(n+ekVXF;0(B1rbP3LXJz{SQI1w+JGH**`%#_p7i}65Um%&1A)5xP&CISfOkGnGvzI5e<`{bU+<011Yig&8em-APc}$lj zQ|6Ky=enHMnq+PWaU<#qNbz`hG%gn4jk=Z&$<|KI%w}^Nw5-YI#!RJ2Fkrh9hCDr7Rh|4J%+wcW> zgs<^`uT-V9-1^vM=bA~y2o!vSxNwszp2beMWN;}k*>f_jf4ODH=y5%2Cgn<9DR>C> z7={*8=&Z^N<;{wj^t!~+FdS=4POL;^IXA(tdc^EWirMT-Yhp5 ziYddR2*@VI$Vw^Y70FaI72#N)lv^hIvl|h&h=Mp*R4(bJ5=+ULPt%%p#WbN`qG+UH zRc|QA zb})sun$fi;B`)*EtnN-!R6|K5%_$t6lCTPW8AW%u5-oWHN_+##IxC##9pM7mi0Mj( zyulXeQlrW0;)?et2wYaT+LU!wO7WDUzRVui^t6O>uu#{s8G}8k$$TC*pD@@G2^(9g z#g#@yj-!=TV@corY>5(+RYNw|Qc0B(vOr*}7v%nE;1c!}GL6qQFgK2r_L^k0-$tJL z3nHy41m6F`JWETc>K6%Zrva;UNI+;C%fRwUkQqz@Jyht)+ksTQ_n#Mit zPwNRu_2Y;=Bk8acUV^TS|J$n)lR0Vt1v)B|qMC97h3XkClTAsWt~4S2*fJbO6Qvk_ zQNa}Ox8@bb^7Hcqy^-L!m&=k4mm5L3jYgS2=sP%QCsAbFr11(}JS1AmOJCXu^cW~a zRDON8mkoGlJKmU=TU3?Th?$;y*z#;cnvyHd=e2|y4W)+8>(ZzNYZeCILW{A+i zgwVz6IurW+h{WwF?lt!=Ksg&sT@EIYz>p2vxgM z2QK0GB^Pi9eFw7@8Mv(UHef605k-Gc#b`f%0Sn3jwnd|EH7l!^bTRjB;D0mzGH<)5@NwP@s78W5#%l`N80yJChSpJ{Rvcait+0-Pvyc zat&vLO*LjyWIsIz+`F6-niRM~GAe_XZkfW<2x;7RNm)vn$tgU6nyjnT>58RWB7wOH zx&@j0*I-H0%+ySs+T7e67595Irlr{`O`a2OYoWV?g&PJ7^!h&xwnojS8)UsTaFMuy z#`OEQ+?WAxLd8`#MoLT{N37LPUDuYN1=HwZwbDBxZkTw9;NcxJaIa~r@a%~!ibtN4 zbpv5q!x8bSyxI&r$E%}N(W-{(3CrA9RAi}_8FB3Me& zqlz}+nWyU`?$Z)#BMT6~HGEoC^+S=WMd3U8@#=?brq6h=Y9{39*%GPOCDlktrl!~M`AJz#M4rTZZwYSy+H7^z^y=x;qaGic zlc3v(4t6%Cs);NzxrV=zT=@h(99GspA9P0Q@u?CX;k8Sa%tPNZvb5_-arHhuzxb?EUC!Yl`(RsswB0#z(COS%$Zh;$WN+!y&+0gtA3kDt4_JrxTRXN|ZEqL% z91c(WEVqvPLL=dU{NV9mn)B8$rUfQoj{6x{e7)E19${8{m%Xvw*|Ld=2_dUQSN{A3 zXIDRrW7g+Cz$@!eK$f6(jA^QX5BgzdOQuXAX~IF}24q;ZsBnLy8F=aZS%z~;c$@Nr@7Nvmz3 z!dPZ?blYdzXiJ5+w|Pz|Z&<@a&e8U;wan|v59X{~`9QE73x4GXw|S>j>cW~Q#SxFO z$Jx6fm|B`)4GtC#9mUa85N_F7%pI^dZ$Z=PZ?{G|KFh6j&b;Fs-D9_Pdy@-&-G#m( zYisuxBU|%>eV*G8V_3DYcE5Gtlr^xu(6+g_zQ53U-adf-&CbySh{y0Y3p+ZICxJDv z%SNyRpS$?oH>t zPKIs5SIikb?7X)j{AGt-S)*I?7f#r_&M|AtHfuEJxs%!3+w5bnF)um=!V3gpE5-s} zVX<@e&b?OWHmCno5gtFZ-`>8%8tSMVum^kmfi0sHDs2NHC4N_UO=kPO&apnLv#s=j z$KlL!$#-_xy<4z@;+{??*HP#@4-Xd)tS#<4#7bcaZ#d_6Atu+`U4!F&;!yw%ZnJlv zw7cGg2y-@_Dt70v7%T4EZ*4qQ>~3dXdND6|sW?@fWkuz4%U3A>gS2OMXRkF-mQ+!E z=Y_Xba(cxYsE0@r5hCFkrM-rG%ar1~&&$Y?_rtOn7Rv_Lhc(iL1g!Yr8*>Et^SxB9 z%K*<6dxov!oyGO<<%iEO=k&1i-YHMNwez4`97e`|;f3uf^dCpnrVl$YE#%94IEwF5}jutG+?6*bwttim%%O{oH(eTV$Ii2@_63A+m{D4XDPjM81@ zM$#oGkQoD;!|PzH&bpzp3H}YuoSqZNSKAHq{P1x8eAoDL&=(%?CV1r~a0?T?Ay0Zo zT<(F;TESF22#UEq6?XwLPb9^-tBVqb^C=$O%IssbZQ6YKh5ikjN98TxS|X3OBcZ*# zVJKYIzMR;Lm-*gh6&PDSHs&2uKK#bn!ojU%e|r}~xNNL&B8RJUe6`+K*yYUbd6yC_ zxA0ednvE~%RzJV=1?zf6vCJs1E2L9=qlJYK@%iCg zacG1d86^+kI<)%M;nn0l4D61M!i51l_ZBij9CIKM#1usHLp_KUy3CO|@8*hIH?Tm? zIkVHgfU9$Dann&}&$`0F9%mOd?OhkFq27|5-S!*I4%_J8bN}a8n|}#}&j%L`t|PqI h#3x!sfQzdvbpKp#0%>aHP*d_**+&+tV4=T_{SQ7%DG>kw literal 0 HcmV?d00001 diff --git a/ckanext/showcase/i18n/zh_Hant_TW/LC_MESSAGES/ckanext-showcase.po b/ckanext/showcase/i18n/zh_Hant_TW/LC_MESSAGES/ckanext-showcase.po new file mode 100644 index 00000000..a11424ff --- /dev/null +++ b/ckanext/showcase/i18n/zh_Hant_TW/LC_MESSAGES/ckanext-showcase.po @@ -0,0 +1,524 @@ +# Chinese (Traditional, Taiwan) translations for ckanext-showcase. +# Copyright (C) 2021 The depositar Team +# This file is distributed under the same license as the ckanext-showcase +# project. +# Cheng-Jen Lee , 2021. +# +msgid "" +msgstr "" +"Project-Id-Version: ckanext-showcase 1.0.0b1\n" +"Report-Msgid-Bugs-To: data.contact@depositar.io\n" +"POT-Creation-Date: 2015-09-23 14:49+0100\n" +"PO-Revision-Date: 2021-11-26 17:34+0800\n" +"Last-Translator: Cheng-Jen Lee \n" +"Language: zh_Hant_TW\n" +"Language-Team: zh_Hant_TW \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.7.0\n" + +#: ckanext/showcase/controller.py:56 +msgid "Unauthorized to create a package" +msgstr "沒有權限建立資料集" + +#: ckanext/showcase/controller.py:71 ckanext/showcase/controller.py:267 +msgid "User not authorized to edit {showcase_id}" +msgstr "使用者沒有權限編輯 {showcase_id}" + +#: ckanext/showcase/controller.py:147 ckanext/showcase/controller.py:184 +#: ckanext/showcase/controller.py:224 ckanext/showcase/controller.py:238 +#: ckanext/showcase/controller.py:274 +msgid "Showcase not found" +msgstr "展示案例不存在" + +#: ckanext/showcase/controller.py:149 ckanext/showcase/controller.py:276 +msgid "Unauthorized to read showcase" +msgstr "沒有權限讀取展示案例" + +#: ckanext/showcase/controller.py:171 ckanext/showcase/controller.py:182 +msgid "Unauthorized to delete showcase" +msgstr "沒有權限刪除展示案例" + +#: ckanext/showcase/controller.py:176 +msgid "Showcase has been deleted." +msgstr "此展示案例已被刪除" + +#: ckanext/showcase/controller.py:201 ckanext/showcase/controller.py:210 +msgid "Dataset not found" +msgstr "資料集不存在" + +#: ckanext/showcase/controller.py:203 +msgid "Not authorized to see this page" +msgstr "沒有權限瀏覽此頁面" + +#: ckanext/showcase/controller.py:212 +msgid "Unauthorized to read package" +msgstr "沒有權限讀取資料集" + +#: ckanext/showcase/controller.py:227 ckanext/showcase/controller.py:329 +msgid "The dataset has been added to the showcase." +msgid_plural "The datasets have been added to the showcase." +msgstr[0] "此資料集已加入展示案例" + +#: ckanext/showcase/controller.py:241 ckanext/showcase/controller.py:297 +msgid "The dataset has been removed from the showcase." +msgid_plural "The datasets have been removed from the showcase." +msgstr[0] "已從展示案例移除此資料集" + +#: ckanext/showcase/controller.py:462 ckanext/showcase/templates/header.html:6 +msgid "Organizations" +msgstr "組織" + +#: ckanext/showcase/controller.py:463 ckanext/showcase/templates/header.html:7 +#: ckanext/showcase/templates/package/read_base.html:5 +msgid "Groups" +msgstr "群組" + +#: ckanext/showcase/controller.py:464 ckanext/showcase/plugin.py:103 +#: ckanext/showcase/templates/showcase/new_package_form.html:33 +msgid "Tags" +msgstr "標籤" + +#: ckanext/showcase/controller.py:465 +msgid "Formats" +msgstr "格式" + +#: ckanext/showcase/controller.py:466 +msgid "Licenses" +msgstr "授權" + +#: ckanext/showcase/controller.py:516 +msgid "Parameter '{parameter_name}' is not an integer" +msgstr "參數 '{parameter_name}' 並不是整數" + +#: ckanext/showcase/controller.py:531 ckanext/showcase/controller.py:567 +msgid "User not authorized to view page" +msgstr "使用者沒有權限瀏覽頁面" + +#: ckanext/showcase/controller.py:540 ckanext/showcase/controller.py:581 +msgid "Unauthorized to perform that action" +msgstr "沒有權限執行此動作" + +#: ckanext/showcase/controller.py:542 +msgid "User '{user_name}' not found." +msgstr "使用者 '{user_name}' 不存在" + +#: ckanext/showcase/controller.py:547 +msgid "The user is now a Showcase Admin" +msgstr "已將此使用者設為展示案例管理者" + +#: ckanext/showcase/controller.py:583 +msgid "The user is not a Showcase Admin" +msgstr "此使用者現在不是展示案例的管理者" + +#: ckanext/showcase/controller.py:585 +msgid "The user is no longer a Showcase Admin" +msgstr "此使用者已不再是展示案例的管理者" + +#: ckanext/showcase/logic/converters.py:24 +#: ckanext/showcase/logic/validators.py:29 +msgid "Not found" +msgstr "不存在" + +#: ckanext/showcase/logic/converters.py:24 +#: ckanext/showcase/logic/validators.py:29 +#: ckanext/showcase/templates/package/read_base.html:4 +msgid "Dataset" +msgstr "資料集" + +#: ckanext/showcase/templates/header.html:5 +msgid "Datasets" +msgstr "資料集" + +#: ckanext/showcase/templates/header.html:8 +#: ckanext/showcase/templates/package/dataset_showcase_list.html:3 +#: ckanext/showcase/templates/package/read_base.html:7 +#: ckanext/showcase/templates/showcase/edit_base.html:5 +#: ckanext/showcase/templates/showcase/edit_base.html:17 +#: ckanext/showcase/templates/showcase/edit_base.html:21 +#: ckanext/showcase/templates/showcase/read.html:6 +#: ckanext/showcase/templates/showcase/read.html:33 +#: ckanext/showcase/templates/showcase/search.html:4 +#: ckanext/showcase/templates/showcase/search.html:7 +msgid "Showcases" +msgstr "展示案例" + +#: ckanext/showcase/templates/header.html:9 +msgid "About" +msgstr "關於" + +#: ckanext/showcase/templates/admin/confirm_remove_showcase_admin.html:3 +#: ckanext/showcase/templates/admin/confirm_remove_showcase_admin.html:16 +msgid "Confirm Remove" +msgstr "確認刪除" + +#: ckanext/showcase/templates/admin/confirm_remove_showcase_admin.html:11 +msgid "Are you sure you want to remove this user as a Showcase Admin - {name}?" +msgstr "確定要將使用者 {name} 從展示案例管理者中移除嗎?" + +#: ckanext/showcase/templates/admin/confirm_remove_showcase_admin.html:15 +#: ckanext/showcase/templates/showcase/confirm_delete.html:14 +msgid "Cancel" +msgstr "取消" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:9 +msgid "Manage Showcase Admins" +msgstr "管理展示案例管理者" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:16 +msgid "Add an Existing User" +msgstr "從已存在使用者新增" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:19 +msgid "" +"To make an existing user a Showcase Admin, search for their username " +"below." +msgstr "欲將已存在使用者設為展示案例管理者,請在下面搜尋" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:23 +msgid "Username" +msgstr "使用者" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:32 +msgid "Add User" +msgstr "新增使用者" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:38 +msgid "Showcase Admins" +msgstr "展示案例管理者" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:43 +msgid "User" +msgstr "使用者" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:51 +msgid "Are you sure you want to remove this user from the Showcase Admin list?" +msgstr "確定要將此使用者從展示案例管理者中移除?" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:53 +#: ckanext/showcase/templates/showcase/snippets/showcase_item.html:46 +msgid "Remove" +msgstr "移除" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:61 +msgid "There are currently no Showcase Admins." +msgstr "目前沒有任何展示案例管理者" + +#: ckanext/showcase/templates/admin/manage_showcase_admins.html:69 +msgid "" +"

Showcase Admin: Can create and remove showcases. Can" +" add and remove datasets from showcases.

" +msgstr "" +"

展示案例管理者: 可以新增和刪除展示案例。" +" 可以於展示案例中新增和移除資料集。

" + +#: ckanext/showcase/templates/home/snippets/stats.html:5 +msgid "{site_title} statistics" +msgstr "{site_title} 統計" + +#: ckanext/showcase/templates/home/snippets/stats.html:10 +msgid "dataset" +msgid_plural "datasets" +msgstr[0] "資料集" + +#: ckanext/showcase/templates/home/snippets/stats.html:16 +msgid "organization" +msgid_plural "organizations" +msgstr[0] "組織" + +#: ckanext/showcase/templates/home/snippets/stats.html:22 +msgid "group" +msgid_plural "groups" +msgstr[0] "群組" + +#: ckanext/showcase/templates/home/snippets/stats.html:28 +msgid "showcase" +msgid_plural "showcases" +msgstr[0] "展示案例" + +#: ckanext/showcase/templates/package/dataset_showcase_list.html:13 +msgid "Associate this showcase with this dataset" +msgstr "將資料集關聯到此展示案例" + +#: ckanext/showcase/templates/package/dataset_showcase_list.html:13 +msgid "Add to showcase" +msgstr "新增到展示案例" + +#: ckanext/showcase/templates/package/dataset_showcase_list.html:17 +msgid "Showcases featuring {dataset_name}" +msgstr "引用 {dataset_name} 的展示案例" + +#: ckanext/showcase/templates/package/dataset_showcase_list.html:22 +msgid "There are no showcases that feature this dataset" +msgstr "沒有展示案例引用此資料集" + +#: ckanext/showcase/templates/package/read_base.html:6 +msgid "Activity Stream" +msgstr "動態牆" + +#: ckanext/showcase/templates/showcase/add_datasets.html:3 +msgid "Showcases - Add datasets" +msgstr "展示案例 - 新增資料集" + +#: ckanext/showcase/templates/showcase/add_datasets.html:21 +#: ckanext/showcase/templates/showcase/manage_datasets.html:24 +#: ckanext/showcase/templates/showcase/search.html:27 +msgid "Relevance" +msgstr "關聯" + +#: ckanext/showcase/templates/showcase/add_datasets.html:22 +#: ckanext/showcase/templates/showcase/manage_datasets.html:25 +#: ckanext/showcase/templates/showcase/search.html:28 +msgid "Name Ascending" +msgstr "根據名稱遞增排序" + +#: ckanext/showcase/templates/showcase/add_datasets.html:23 +#: ckanext/showcase/templates/showcase/manage_datasets.html:26 +#: ckanext/showcase/templates/showcase/search.html:29 +msgid "Name Descending" +msgstr "根據名稱遞減排序" + +#: ckanext/showcase/templates/showcase/add_datasets.html:24 +#: ckanext/showcase/templates/showcase/manage_datasets.html:27 +#: ckanext/showcase/templates/showcase/search.html:30 +msgid "Last Modified" +msgstr "最後修改" + +#: ckanext/showcase/templates/showcase/add_datasets.html:25 +#: ckanext/showcase/templates/showcase/manage_datasets.html:28 +#: ckanext/showcase/templates/showcase/search.html:31 +msgid "Popular" +msgstr "熱門的" + +#: ckanext/showcase/templates/showcase/add_datasets.html:31 +#: ckanext/showcase/templates/showcase/manage_datasets.html:36 +msgid "Datasets available to add to this showcase" +msgstr "可新增到此展示案例的資料集" + +#: ckanext/showcase/templates/showcase/add_datasets.html:48 +#: ckanext/showcase/templates/showcase/manage_datasets.html:51 +msgid "Add to Showcase" +msgstr "新增到展示案例" + +#: ckanext/showcase/templates/showcase/add_datasets.html:78 +#: ckanext/showcase/templates/showcase/manage_datasets.html:88 +msgid "No datasets could be found" +msgstr "找不到資料集" + +#: ckanext/showcase/templates/showcase/confirm_delete.html:3 +#: ckanext/showcase/templates/showcase/confirm_delete.html:15 +msgid "Confirm Delete" +msgstr "確認刪除" + +#: ckanext/showcase/templates/showcase/confirm_delete.html:11 +msgid "Are you sure you want to delete showcase - {showcase_name}?" +msgstr "確定要刪除展示案例:{showcase_name} 嗎?" + +#: ckanext/showcase/templates/showcase/edit_base.html:19 +msgid "Edit" +msgstr "編輯" + +#: ckanext/showcase/templates/showcase/edit_base.html:22 +#: ckanext/showcase/templates/showcase/new.html:3 +#: ckanext/showcase/templates/showcase/new_package_form.html:63 +msgid "Create Showcase" +msgstr "建立展示案例" + +#: ckanext/showcase/templates/showcase/edit_base.html:35 +msgid "View showcase" +msgstr "瀏覽展示案例" + +#: ckanext/showcase/templates/showcase/edit_base.html:41 +msgid "Edit showcase" +msgstr "編輯展示案例" + +#: ckanext/showcase/templates/showcase/edit_base.html:42 +msgid "Manage datasets" +msgstr "管理資料集" + +#: ckanext/showcase/templates/showcase/manage_datasets.html:3 +msgid "Showcases - Manage datasets" +msgstr "展示案例 - 管理資料集" + +#: ckanext/showcase/templates/showcase/manage_datasets.html:96 +msgid "Datasets in this showcase" +msgstr "此展示案例包含的資料集" + +#: ckanext/showcase/templates/showcase/manage_datasets.html:109 +msgid "Remove from Showcase" +msgstr "從展示案例中移除" + +#: ckanext/showcase/templates/showcase/manage_datasets.html:140 +msgid "This showcase has no datasets associated to it" +msgstr "沒有任何資料集和這個展示案例有關聯" + +#: ckanext/showcase/templates/showcase/new.html:8 +msgid "Create a Showcase" +msgstr "建立一個展示案例" + +#: ckanext/showcase/templates/showcase/new_package_form.html:15 +msgid "Title" +msgstr "標題" + +#: ckanext/showcase/templates/showcase/new_package_form.html:15 +msgid "eg. A descriptive title" +msgstr "例如:一個描述性的標題" + +#: ckanext/showcase/templates/showcase/new_package_form.html:24 +msgid "URL" +msgstr "網址" + +#: ckanext/showcase/templates/showcase/new_package_form.html:24 +msgid "eg. my-showcase" +msgstr "例如:我的展示案例" + +#: ckanext/showcase/templates/showcase/new_package_form.html:28 +msgid "Description" +msgstr "說明" + +#: ckanext/showcase/templates/showcase/new_package_form.html:28 +msgid "eg. Some useful notes about the data" +msgstr "例如:此資料一些有用的紀錄" + +#: ckanext/showcase/templates/showcase/new_package_form.html:33 +msgid "eg. economy, mental health, government" +msgstr "例如:經濟、醫療衛生、政府" + +#: ckanext/showcase/templates/showcase/new_package_form.html:44 +msgid "External link" +msgstr "外部連結" + +#: ckanext/showcase/templates/showcase/new_package_form.html:44 +msgid "http://www.example.com" +msgstr "http://www.example.com" + +#: ckanext/showcase/templates/showcase/new_package_form.html:48 +msgid "Submitted By" +msgstr "作者" + +#: ckanext/showcase/templates/showcase/new_package_form.html:48 +msgid "Joe Bloggs" +msgstr "Joe Bloggs" + +#: ckanext/showcase/templates/showcase/new_package_form.html:50 +msgid "Submitter Email" +msgstr "作者的電子郵件" + +#: ckanext/showcase/templates/showcase/new_package_form.html:50 +msgid "joe@example.com" +msgstr "joe@example.com" + +#: ckanext/showcase/templates/showcase/new_package_form.html:58 +msgid "Are you sure you want to delete this showcase?" +msgstr "確定要刪除此展示案例嗎?" + +#: ckanext/showcase/templates/showcase/new_package_form.html:59 +msgid "Delete" +msgstr "刪除" + +#: ckanext/showcase/templates/showcase/new_package_form.html:63 +msgid "Update Showcase" +msgstr "更新展示案例" + +#: ckanext/showcase/templates/showcase/read.html:46 +msgid "Manage" +msgstr "管理" + +#: ckanext/showcase/templates/showcase/read.html:53 +msgid "Private" +msgstr "非公開" + +#: ckanext/showcase/templates/showcase/read.html:60 +msgid "Draft" +msgstr "草稿" + +#: ckanext/showcase/templates/showcase/read.html:78 +#: ckanext/showcase/templates/showcase/snippets/showcase_info.html:27 +msgid "Launch website" +msgstr "前往網站" + +#: ckanext/showcase/templates/showcase/search.html:13 +msgid "Add Showcase" +msgstr "新增展示案例" + +#: ckanext/showcase/templates/showcase/search.html:33 +msgid "Search showcases..." +msgstr "搜尋展示案例..." + +#: ckanext/showcase/templates/showcase/snippets/helper.html:4 +msgid "What are Showcases?" +msgstr "展示案例是什麼?" + +#: ckanext/showcase/templates/showcase/snippets/helper.html:8 +msgid "" +"Datasets have been used to build apps, websites and visualizations. " +"They've been featured in articles, and written about in news reports and " +"blog posts. Showcases collect together the best examples of datasets in " +"use, to provide further insight, ideas, and inspiration." +msgstr "" +"資料集常被用以打造應用程式、網站或資料視覺化," +"並使用於新聞報導與部落格文章。展示案例蒐集資料集的最佳實踐範例," +"提供深入的見解、想法與靈感。" + +#: ckanext/showcase/templates/showcase/snippets/helper.html:12 +#, python-format +msgid "" +"Sysadmins can manage Showcase Admins from the Showcase " +"configuration page." +msgstr "" +"系統管理員可於展示案例設定管理展示案例管理者。" + +#: ckanext/showcase/templates/showcase/snippets/showcase_info.html:21 +msgid "Submitted by" +msgstr "作者" + +#: ckanext/showcase/templates/showcase/snippets/showcase_info.html:37 +msgid "Datasets in Showcase" +msgstr "展示案例包含的資料集" + +#: ckanext/showcase/templates/showcase/snippets/showcase_info.html:47 +msgid "There are no Datasets in this Showcase" +msgstr "此展示案例沒有包含資料集" + +#: ckanext/showcase/templates/showcase/snippets/showcase_item.html:30 +msgid "This showcase has no description" +msgstr "此展示案例沒有說明" + +#: ckanext/showcase/templates/showcase/snippets/showcase_item.html:35 +msgid "{num} Dataset" +msgid_plural "{num} Datasets" +msgstr[0] "{num} 個資料集" + +#: ckanext/showcase/templates/showcase/snippets/showcase_item.html:37 +msgid "0 Datasets" +msgstr "0 資料集" + +#: ckanext/showcase/templates/showcase/snippets/showcase_item.html:41 +#: ckanext/showcase/templates/showcase/snippets/showcase_item.html:42 +msgid "View {showcase_title}" +msgstr "瀏覽 {showcase_title}" + +#: ckanext/showcase/templates/showcase/snippets/showcase_item.html:46 +msgid "Remove dataset from this showcase" +msgstr "從此展示案例移除資料集" + +#: ckanext/showcase/templates/showcase/snippets/showcase_search_result_text.html:7 +msgid "{number} showcase found for '{query}'" +msgid_plural "{number} showcases found for '{query}'" +msgstr[0] "根據 '{query}' 找到 {number} 個展示案例" + +#: ckanext/showcase/templates/showcase/snippets/showcase_search_result_text.html:8 +msgid "No showcases found for '{query}'" +msgstr "找不到符合 '{query}' 的展示案例" + +#: ckanext/showcase/templates/showcase/snippets/showcase_search_result_text.html:9 +msgid "{number} showcase found" +msgid_plural "{number} showcases found" +msgstr[0] "找到 {number} 個展示案例" + +#: ckanext/showcase/templates/showcase/snippets/showcase_search_result_text.html:10 +msgid "No showcases found" +msgstr "找不到展示案例" + From bc1915772f11f66cce9c98f41fb18028fff81170 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Jan 2022 06:31:10 +0000 Subject: [PATCH 02/77] Bump shelljs from 0.8.4 to 0.8.5 Bumps [shelljs](https://github.com/shelljs/shelljs) from 0.8.4 to 0.8.5. - [Release notes](https://github.com/shelljs/shelljs/releases) - [Changelog](https://github.com/shelljs/shelljs/blob/master/CHANGELOG.md) - [Commits](https://github.com/shelljs/shelljs/compare/v0.8.4...v0.8.5) --- updated-dependencies: - dependency-name: shelljs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 996b5234..d7f215e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7940,9 +7940,9 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "requires": { "glob": "^7.0.0", "interpret": "^1.0.0", From 704b4a09652a66061ba7448c78a06a452426d0da Mon Sep 17 00:00:00 2001 From: Rae Knowler Date: Mon, 17 Jan 2022 16:29:54 +0100 Subject: [PATCH 03/77] Bump version to 1.4.8 --- CHANGELOG.md | 5 +++++ setup.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c35652af..7cc58cdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Ckanext-showcase CHANGELOG +## v1.4.8 2022-01-17 + +* Add Chinese (Traditional, Taiwan) translations (#136) +* Dependency update + ## v1.4.7 2022-01-04 * Fix ReST in README (#133) diff --git a/setup.py b/setup.py index 4f8ed6e4..89b2fef8 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ # Versions should comply with PEP440. For a discussion on single-sourcing # the version across setup.py and the project code, see # https://packaging.python.org/en/latest/distributing.html#version - version='1.4.7', + version='1.4.8', description='''A ckan extension to showcase datasets in use''', long_description=long_description, From fd264684e9a03a524ee759d3a0c5d1e2ef08ef07 Mon Sep 17 00:00:00 2001 From: Sol Lee Date: Sun, 30 Jan 2022 15:20:52 +0800 Subject: [PATCH 04/77] Fix typo --- ckanext/showcase/templates/package/dataset_showcase_list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ckanext/showcase/templates/package/dataset_showcase_list.html b/ckanext/showcase/templates/package/dataset_showcase_list.html index 972b3e6e..35f31591 100644 --- a/ckanext/showcase/templates/package/dataset_showcase_list.html +++ b/ckanext/showcase/templates/package/dataset_showcase_list.html @@ -10,7 +10,7 @@ {% endfor %} - + {% endif %} From f182fed1d7d9f388ada795ed7dabf626ea040e83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Feb 2022 11:03:41 +0000 Subject: [PATCH 05/77] Bump ajv from 6.12.2 to 6.12.6 Bumps [ajv](https://github.com/ajv-validator/ajv) from 6.12.2 to 6.12.6. - [Release notes](https://github.com/ajv-validator/ajv/releases) - [Commits](https://github.com/ajv-validator/ajv/compare/v6.12.2...v6.12.6) --- updated-dependencies: - dependency-name: ajv dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7f215e8..be1877df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -989,9 +989,9 @@ } }, "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", From 234595cd921e55a3bb07a6fc3528e0d6d1d39d50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 26 Mar 2022 16:57:10 +0000 Subject: [PATCH 06/77] Bump minimist from 1.2.5 to 1.2.6 Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7f215e8..a8217e77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5541,9 +5541,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minimist-options": { "version": "3.0.2", From 7727cb3b776c9ca90ace8d619b55690c0b51e51e Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 16:07:14 -0300 Subject: [PATCH 07/77] Run tests on 2.10 --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 07b15917..968a168e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: needs: lint strategy: matrix: - ckan-version: [2.9, 2.9-py2, 2.8, 2.7] + ckan-version: ["2.10", 2.9, 2.9-py2, 2.8, 2.7] fail-fast: false name: CKAN ${{ matrix.ckan-version }} @@ -26,7 +26,7 @@ jobs: image: openknowledge/ckan-dev:${{ matrix.ckan-version }} services: solr: - image: ckan/ckan-solr-dev:${{ matrix.ckan-version }} + image: ckan/ckan-solr:${{ matrix.ckan-version }} postgres: image: ckan/ckan-postgres-dev:${{ matrix.ckan-version }} env: From 8e6332fb4381ba7b0ecfc7629cf7d3c6f0584158 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 16:36:32 -0300 Subject: [PATCH 08/77] Do not use built-in as validators --- ckanext/showcase/logic/schema.py | 68 ++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/ckanext/showcase/logic/schema.py b/ckanext/showcase/logic/schema.py index 27f9f516..3c9b953d 100644 --- a/ckanext/showcase/logic/schema.py +++ b/ckanext/showcase/logic/schema.py @@ -1,20 +1,6 @@ # -*- coding: utf-8 -*- - -import six import ckan.plugins.toolkit as toolkit -from ckan.lib.navl.validators import (not_empty, - empty, - if_empty_same_as, - ignore_missing, - ignore, - keep_extras) -from ckan.logic.validators import (package_id_not_changed, - name_validator, - user_id_or_name_exists, - package_name_validator, - tag_string_convert, - ignore_not_package_admin, - no_http) + from ckan.logic.schema import (default_tags_schema, default_extras_schema, default_resource_schema) @@ -23,20 +9,42 @@ convert_package_name_or_id_to_id_for_type_dataset, convert_package_name_or_id_to_id_for_type_showcase) +if toolkit.check_ckan_version("2.10"): + unicode_safe = toolkit.get_validator("unicode_safe") +else: + import six + unicode_safe = six.text_type + + +not_empty = toolkit.get_validator("not_empty") +empty = toolkit.get_validator("empty") +if_empty_same_as = toolkit.get_validator("if_empty_same_as") +ignore_missing = toolkit.get_validator("ignore_missing") +ignore = toolkit.get_validator("ignore") +keep_extras = toolkit.get_validator("keep_extras") + +package_id_not_changed = toolkit.get_validator("package_id_not_changed") +name_validator = toolkit.get_validator("name_validator") +user_id_or_name_exists = toolkit.get_validator("user_id_or_name_exists") +package_name_validator = toolkit.get_validator("package_name_validator") +tag_string_convert = toolkit.get_validator("tag_string_convert") +ignore_not_package_admin = toolkit.get_validator("ignore_not_package_admin") +no_http = toolkit.get_validator("no_http") +url_validator = toolkit.get_validator("url_validator") def showcase_base_schema(): schema = { 'id': [empty], 'revision_id': [ignore], - 'name': [not_empty, six.text_type, name_validator, package_name_validator], - 'title': [if_empty_same_as("name"), six.text_type], - 'author': [ignore_missing, six.text_type], - 'author_email': [ignore_missing, six.text_type], - 'notes': [ignore_missing, six.text_type], - 'url': [ignore_missing, six.text_type], + 'name': [not_empty, name_validator, package_name_validator], + 'title': [if_empty_same_as("name"), unicode_safe], + 'author': [ignore_missing, unicode_safe], + 'author_email': [ignore_missing, unicode_safe], + 'notes': [ignore_missing, unicode_safe], + 'url': [ignore_missing, url_validator], 'state': [ignore_not_package_admin, ignore_missing], - 'type': [ignore_missing, six.text_type], - 'log_message': [ignore_missing, six.text_type, no_http], + 'type': [ignore_missing, unicode_safe], + 'log_message': [ignore_missing, unicode_safe, no_http], '__extras': [ignore], '__junk': [empty], 'resources': default_resource_schema(), @@ -68,11 +76,11 @@ def showcase_update_schema(): # Supplying the package name when updating a package is optional (you can # supply the id to identify the package instead). schema['name'] = [ignore_missing, name_validator, - package_name_validator, six.text_type] + package_name_validator, unicode_safe] # Supplying the package title when updating a package is optional, if it's # not supplied the title will not be changed. - schema['title'] = [ignore_missing, six.text_type] + schema['title'] = [ignore_missing, unicode_safe] return schema @@ -119,9 +127,9 @@ def showcase_show_schema(): def showcase_package_association_create_schema(): schema = { - 'package_id': [not_empty, six.text_type, + 'package_id': [not_empty, unicode_safe, convert_package_name_or_id_to_id_for_type_dataset], - 'showcase_id': [not_empty, six.text_type, + 'showcase_id': [not_empty, unicode_safe, convert_package_name_or_id_to_id_for_type_showcase] } return schema @@ -133,7 +141,7 @@ def showcase_package_association_delete_schema(): def showcase_package_list_schema(): schema = { - 'showcase_id': [not_empty, six.text_type, + 'showcase_id': [not_empty, unicode_safe, convert_package_name_or_id_to_id_for_type_showcase] } return schema @@ -141,7 +149,7 @@ def showcase_package_list_schema(): def package_showcase_list_schema(): schema = { - 'package_id': [not_empty, six.text_type, + 'package_id': [not_empty, unicode_safe, convert_package_name_or_id_to_id_for_type_dataset] } return schema @@ -149,7 +157,7 @@ def package_showcase_list_schema(): def showcase_admin_add_schema(): schema = { - 'username': [not_empty, user_id_or_name_exists, six.text_type], + 'username': [not_empty, user_id_or_name_exists, unicode_safe], } return schema From 40aefde174507cc3c9f4b3a6b0305441de6ab5c2 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 16:45:15 -0300 Subject: [PATCH 09/77] Use jinja2 truncate filter --- ckanext/showcase/templates/showcase/add_datasets.html | 2 +- ckanext/showcase/templates/showcase/manage_datasets.html | 4 ++-- .../showcase/templates/showcase/snippets/showcase_info.html | 2 +- .../showcase/templates/showcase/snippets/showcase_item.html | 2 +- ckanext/showcase/templates/showcase/snippets/tags.html | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ckanext/showcase/templates/showcase/add_datasets.html b/ckanext/showcase/templates/showcase/add_datasets.html index 6b79ddf2..a2693ed5 100644 --- a/ckanext/showcase/templates/showcase/add_datasets.html +++ b/ckanext/showcase/templates/showcase/add_datasets.html @@ -63,7 +63,7 @@

- {{ h.link_to(h.truncate(title, truncate_title), h.url_for(controller='package', action='read', id=package.name)) }} + {{ h.link_to(title|truncate(truncate_title), h.url_for(controller='package', action='read', id=package.name)) }}

{% if notes %}

{{ notes|urlize }}

diff --git a/ckanext/showcase/templates/showcase/manage_datasets.html b/ckanext/showcase/templates/showcase/manage_datasets.html index 78eabb52..b1da5c6e 100644 --- a/ckanext/showcase/templates/showcase/manage_datasets.html +++ b/ckanext/showcase/templates/showcase/manage_datasets.html @@ -66,7 +66,7 @@

{{ _('Datasets available to add to this showcase') }}

- {{ h.link_to(h.truncate(title, truncate_title), h.url_for(controller='dataset' if h.ckan_version().split('.')[1] | int >= 9 else 'package', action='read', id=package.name)) }} + {{ h.link_to(title|truncate(truncate_title), h.url_for(controller='dataset' if h.ckan_version().split('.')[1] | int >= 9 else 'package', action='read', id=package.name)) }}

{% if notes %}

{{ notes|urlize }}

@@ -124,7 +124,7 @@

{{ _('Datasets in this showcase') }}

- {{ h.link_to(h.truncate(title, truncate_title), h.url_for(controller='dataset' if h.ckan_version().split('.')[1] | int >= 9 else 'package', action='read', id=package.name)) }} + {{ h.link_to(title|truncate(truncate_title), h.url_for(controller='dataset' if h.ckan_version().split('.')[1] | int >= 9 else 'package', action='read', id=package.name)) }}

{% if notes %}

{{ notes|urlize }}

diff --git a/ckanext/showcase/templates/showcase/snippets/showcase_info.html b/ckanext/showcase/templates/showcase/snippets/showcase_info.html index a684a934..fb1e3a0f 100644 --- a/ckanext/showcase/templates/showcase/snippets/showcase_info.html +++ b/ckanext/showcase/templates/showcase/snippets/showcase_info.html @@ -40,7 +40,7 @@

{{ h.link_to(h.truncate(title, truncate_title), h.url_for(controller='dataset' if h.ckan_version().split('.')[1] | int >= 9 else 'package', action='read', id=package.name)) }} + {% endfor %} {% else %} diff --git a/ckanext/showcase/templates/showcase/snippets/showcase_item.html b/ckanext/showcase/templates/showcase/snippets/showcase_item.html index 35a70715..ca8c199e 100644 --- a/ckanext/showcase/templates/showcase/snippets/showcase_item.html +++ b/ckanext/showcase/templates/showcase/snippets/showcase_item.html @@ -25,7 +25,7 @@ {{ package.name }} {% endblock %} {% block title %} -

{{ h.link_to(h.truncate(title, truncate_title), h.url_for(showcase_read_route, id=package.name)) }}

+

{{ h.link_to(title|truncate(truncate_title), h.url_for(showcase_read_route, id=package.name)) }}

{% endblock %} {% block notes %} {% if notes %} diff --git a/ckanext/showcase/templates/showcase/snippets/tags.html b/ckanext/showcase/templates/showcase/snippets/tags.html index ade9da29..dae2e08e 100644 --- a/ckanext/showcase/templates/showcase/snippets/tags.html +++ b/ckanext/showcase/templates/showcase/snippets/tags.html @@ -8,7 +8,7 @@ From f9a427622ffad7dbc848ed25fce95f48b8086ea7 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 17:10:54 -0300 Subject: [PATCH 10/77] Fix IPackageController for CKAN 2.10 --- ckanext/showcase/plugin/__init__.py | 79 +++++++++++++++++++---------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/ckanext/showcase/plugin/__init__.py b/ckanext/showcase/plugin/__init__.py index 1a964b89..08d4f9b3 100644 --- a/ckanext/showcase/plugin/__init__.py +++ b/ckanext/showcase/plugin/__init__.py @@ -11,7 +11,6 @@ import ckan.plugins as plugins import ckan.lib.plugins as lib_plugins import ckan.lib.helpers as h -from ckan import model as ckan_model import ckantoolkit as tk @@ -28,7 +27,6 @@ else: from ckanext.showcase.plugin.pylons_plugin import MixinPlugin -c = tk.c _ = tk._ log = logging.getLogger(__name__) @@ -183,33 +181,58 @@ def _add_to_pkg_dict(self, context, pkg_dict): return pkg_dict - def after_show(self, context, pkg_dict): - ''' - Modify package_show pkg_dict. - ''' - pkg_dict = self._add_to_pkg_dict(context, pkg_dict) - - def before_view(self, pkg_dict): - ''' - Modify pkg_dict that is sent to templates. - ''' - context = {'model': ckan_model, 'session': ckan_model.Session, - 'user': c.user or c.author} - - return self._add_to_pkg_dict(context, pkg_dict) - - def before_search(self, search_params): - ''' - Unless the query is already being filtered by this dataset_type - (either positively, or negatively), exclude datasets of type - `showcase`. - ''' - fq = search_params.get('fq', '') - filter = 'dataset_type:{0}'.format(DATASET_TYPE_NAME) - if filter not in fq: - search_params.update({'fq': fq + " -" + filter}) - return search_params + if tk.check_ckan_version("2.10"): + def after_package_show(self, context, pkg_dict): + ''' + Modify package_show pkg_dict. + ''' + pkg_dict = self._add_to_pkg_dict(context, pkg_dict) + + def before_package_view(self, pkg_dict): + ''' + Modify pkg_dict that is sent to templates. + ''' + context = {'user': tk.g.user or tk.g.author} + + return self._add_to_pkg_dict(context, pkg_dict) + + def before_package_search(self, search_params): + ''' + Unless the query is already being filtered by this dataset_type + (either positively, or negatively), exclude datasets of type + `showcase`. + ''' + fq = search_params.get('fq', '') + filter = 'dataset_type:{0}'.format(DATASET_TYPE_NAME) + if filter not in fq: + search_params.update({'fq': fq + " -" + filter}) + return search_params + else: + def after_show(self, context, pkg_dict): + ''' + Modify package_show pkg_dict. + ''' + pkg_dict = self._add_to_pkg_dict(context, pkg_dict) + + def before_view(self, pkg_dict): + ''' + Modify pkg_dict that is sent to templates. + ''' + context = {'user': tk.g.user or tk.g.author} + return self._add_to_pkg_dict(context, pkg_dict) + + def before_search(self, search_params): + ''' + Unless the query is already being filtered by this dataset_type + (either positively, or negatively), exclude datasets of type + `showcase`. + ''' + fq = search_params.get('fq', '') + filter = 'dataset_type:{0}'.format(DATASET_TYPE_NAME) + if filter not in fq: + search_params.update({'fq': fq + " -" + filter}) + return search_params # ITranslation From fc3acd2bf0c94cc1d4e9f3dd4cb01184ef7bb60f Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 17:19:53 -0300 Subject: [PATCH 11/77] Fix url_for --- ckanext/showcase/templates/showcase/new_package_form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ckanext/showcase/templates/showcase/new_package_form.html b/ckanext/showcase/templates/showcase/new_package_form.html index 3003a571..626adafc 100644 --- a/ckanext/showcase/templates/showcase/new_package_form.html +++ b/ckanext/showcase/templates/showcase/new_package_form.html @@ -36,7 +36,7 @@ {% set ckeditor_attrs = { 'data-module': 'showcase-ckeditor', - 'data-module-site_url': h.url('/', qualified=true)} + 'data-module-site_url': h.url_for('/', qualified=true)} %} {{ form.textarea('notes', id='editor', label=_('Description'), placeholder=_('eg. Some useful notes about the data'), value=data.notes, error=errors.notes, attrs=ckeditor_attrs)}} {% else %} From e23526e7093bc3e84b2fe628a1700c6f4f6fbe17 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 17:44:03 -0300 Subject: [PATCH 12/77] Fix get_action calls --- ckanext/showcase/utils.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index bb0f6cfe..476c6a25 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -14,7 +14,7 @@ import ckan.logic as logic import ckan.lib.navl.dictization_functions as dict_fns import ckan.lib.helpers as h -import ckantoolkit as tk +import ckan.plugins.toolkit as tk from ckanext.showcase.model import ShowcasePackageAssociation _ = tk._ @@ -128,7 +128,7 @@ def manage_datasets_view(id): manage_route = 'showcase_blueprint.manage_datasets' else: manage_route = 'showcase_manage_datasets' - + if (tk.request.method == 'POST' and 'bulk_action.showcase_remove' in form_data): # Find the datasets to perform the action on, they are prefixed by @@ -196,7 +196,7 @@ def manage_datasets_view(id): def migrate(allow_duplicates): - related_items = tk.get_action('related_list')(data_dict={}) + related_items = tk.get_action('related_list')({}, {}) # preflight: # related items must have unique titles before migration @@ -213,7 +213,7 @@ def migrate(allow_duplicates): return for related in related_items: - existing_showcase = tk.get_action('package_search')(data_dict={ + existing_showcase = tk.get_action('package_search')({}, { 'fq': '+dataset_type:showcase original_related_item_id:{0}'.format( related['id']) @@ -239,7 +239,8 @@ def migrate(allow_duplicates): # make the showcase try: new_showcase = tk.get_action('ckanext_showcase_create')( - data_dict=data_dict) + {}, data_dict + ) except Exception as e: print('There was a problem migrating "{0}": {1}'.format( normalized_title, e)) @@ -253,7 +254,8 @@ def migrate(allow_duplicates): if related_pkg_id: tk.get_action( 'ckanext_showcase_package_association_create')( - data_dict={ + {}, + { 'showcase_id': new_showcase['id'], 'package_id': related_pkg_id }) @@ -645,9 +647,9 @@ def manage_showcase_admins(): if tk.request.method == 'POST' and form_data['username']: username = form_data['username'] try: - tk.get_action('ckanext_showcase_admin_add')(data_dict={ - 'username': username - }) + tk.get_action('ckanext_showcase_admin_add')( + {}, {'username': username} + ) except tk.NotAuthorized: abort(401, _('Unauthorized to perform that action')) except tk.ObjectNotFound: @@ -660,7 +662,7 @@ def manage_showcase_admins(): return tk.redirect_to(h.url_for(admins_route)) - c.showcase_admins = tk.get_action('ckanext_showcase_admin_list')() + c.showcase_admins = tk.get_action('ckanext_showcase_admin_list')({},{}) return tk.render('admin/manage_showcase_admins.html') @@ -695,9 +697,9 @@ def remove_showcase_admin(): if tk.request.method == 'POST' and user_id: user_id = tk.request.params['user'] try: - tk.get_action('ckanext_showcase_admin_remove')(data_dict={ - 'username': user_id - }) + tk.get_action('ckanext_showcase_admin_remove')( + {}, {'username': user_id} + ) except tk.NotAuthorized: return tk.abort(401, _('Unauthorized to perform that action')) except tk.ObjectNotFound: @@ -707,7 +709,7 @@ def remove_showcase_admin(): return tk.redirect_to(h.url_for(admins_route)) - c.user_dict = tk.get_action('user_show')(data_dict={'id': user_id}) + c.user_dict = tk.get_action('user_show')({}, {'id': user_id}) c.user_id = user_id return tk.render('admin/confirm_remove_showcase_admin.html') @@ -718,7 +720,7 @@ def markdown_to_html(): markdown, this command will migrate all nothes using CKAN's render_markdown core helper. ''' - showcases = tk.get_action('ckanext_showcase_list')(data_dict={}) + showcases = tk.get_action('ckanext_showcase_list')({},{}) site_user = tk.get_action('get_site_user')({ 'model': model, From 6440087a3a7a9f7971b0f8007707163edeecfe2d Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 17:52:20 -0300 Subject: [PATCH 13/77] Fix typos on IPackage methods --- ckanext/showcase/plugin/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ckanext/showcase/plugin/__init__.py b/ckanext/showcase/plugin/__init__.py index 08d4f9b3..5514d81e 100644 --- a/ckanext/showcase/plugin/__init__.py +++ b/ckanext/showcase/plugin/__init__.py @@ -183,13 +183,13 @@ def _add_to_pkg_dict(self, context, pkg_dict): if tk.check_ckan_version("2.10"): - def after_package_show(self, context, pkg_dict): + def after_dataset_show(self, context, pkg_dict): ''' Modify package_show pkg_dict. ''' pkg_dict = self._add_to_pkg_dict(context, pkg_dict) - def before_package_view(self, pkg_dict): + def before_dataset_view(self, pkg_dict): ''' Modify pkg_dict that is sent to templates. ''' @@ -197,7 +197,7 @@ def before_package_view(self, pkg_dict): return self._add_to_pkg_dict(context, pkg_dict) - def before_package_search(self, search_params): + def before_dataset_search(self, search_params): ''' Unless the query is already being filtered by this dataset_type (either positively, or negatively), exclude datasets of type From 6e0f79c0d52060b2a28122fb6b1c4d2ae22d1f97 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 18:02:54 -0300 Subject: [PATCH 14/77] Fix stats.html routes --- ckanext/showcase/templates/home/snippets/stats.html | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ckanext/showcase/templates/home/snippets/stats.html b/ckanext/showcase/templates/home/snippets/stats.html index 30c3333b..a122f7aa 100644 --- a/ckanext/showcase/templates/home/snippets/stats.html +++ b/ckanext/showcase/templates/home/snippets/stats.html @@ -1,5 +1,8 @@ {% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} {% set showcase_index_route = 'showcase_blueprint.index' if ckan_29_or_higher else 'showcase_index' %} +{% set search_route = 'dataset.search' if ckan_29_or_higher else 'package_search' %} +{% set organization_route = 'organization.index' if ckan_29_or_higher else 'organization_index' %} +{% set group_route = 'group.index' if ckan_29_or_higher else 'group_index' %} {% set stats = h.get_site_statistics() %} @@ -8,19 +11,19 @@

{{ _('{site_title} statistics').format(site_title=g.site_title) }}

  • - + {{ h.SI_number_span(stats.dataset_count) }} {{ ungettext('dataset', 'datasets', stats.dataset_count) }}
  • - + {{ h.SI_number_span(stats.organization_count) }} {{ ungettext('organization', 'organizations', stats.organization_count) }}
  • - + {{ h.SI_number_span(stats.group_count) }} {{ ungettext('group', 'groups', stats.group_count) }} From cca3a57654f36100f6e548ef250c40b144040466 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 18:08:51 -0300 Subject: [PATCH 15/77] Rename deprecated request.params --- ckanext/showcase/plugin/__init__.py | 14 ++------- .../templates/showcase/add_datasets.html | 2 +- .../templates/showcase/manage_datasets.html | 2 +- .../showcase/templates/showcase/search.html | 2 +- ckanext/showcase/utils.py | 30 +++++++++---------- 5 files changed, 20 insertions(+), 30 deletions(-) diff --git a/ckanext/showcase/plugin/__init__.py b/ckanext/showcase/plugin/__init__.py index 5514d81e..4993c455 100644 --- a/ckanext/showcase/plugin/__init__.py +++ b/ckanext/showcase/plugin/__init__.py @@ -44,12 +44,7 @@ class ShowcasePlugin( plugins.implements(plugins.IActions) plugins.implements(plugins.IPackageController, inherit=True) plugins.implements(plugins.ITemplateHelpers) - - # ITranslation only available in 2.5+ - try: - plugins.implements(plugins.ITranslation) - except AttributeError: - pass + plugins.implements(plugins.ITranslation) # IConfigurer @@ -57,7 +52,7 @@ def update_config(self, config): tk.add_template_directory(config, '../templates') tk.add_public_directory(config, '../public') tk.add_resource('../fanstatic', 'showcase') - if tk.check_ckan_version(min_version='2.4', max_version='2.9.0'): + if tk.check_ckan_version(min_version='2.7', max_version='2.9.0'): tk.add_ckan_admin_tab(config, 'showcase_admins', 'Showcase Config') elif tk.check_ckan_version(min_version='2.9.0'): @@ -235,11 +230,6 @@ def before_search(self, search_params): return search_params # ITranslation - - # The following methods copied from ckan.lib.plugins.DefaultTranslation so - # we don't have to mix it into the class. This means we can use Showcase - # even if ITranslation isn't available (less than 2.5). - def i18n_directory(self): '''Change the directory of the *.mo translation files diff --git a/ckanext/showcase/templates/showcase/add_datasets.html b/ckanext/showcase/templates/showcase/add_datasets.html index a2693ed5..956b4c9e 100644 --- a/ckanext/showcase/templates/showcase/add_datasets.html +++ b/ckanext/showcase/templates/showcase/add_datasets.html @@ -24,7 +24,7 @@ (_('Last Modified'), 'metadata_modified desc'), (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ] %} - {% snippet 'snippets/search_form.html', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.params, error=c.query_error, fields=c.fields %} + {% snippet 'snippets/search_form.html', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.args, error=c.query_error, fields=c.fields %} {% endblock %}

    {% block page_heading %} diff --git a/ckanext/showcase/templates/showcase/manage_datasets.html b/ckanext/showcase/templates/showcase/manage_datasets.html index b1da5c6e..1da677ae 100644 --- a/ckanext/showcase/templates/showcase/manage_datasets.html +++ b/ckanext/showcase/templates/showcase/manage_datasets.html @@ -27,7 +27,7 @@ (_('Last Modified'), 'metadata_modified desc'), (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ] %} - {% snippet 'snippets/search_form.html', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.params, error=c.query_error, fields=c.fields %} + {% snippet 'snippets/search_form.html', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.args, error=c.query_error, fields=c.fields %}
    diff --git a/ckanext/showcase/templates/showcase/search.html b/ckanext/showcase/templates/showcase/search.html index b975a013..74da27bb 100644 --- a/ckanext/showcase/templates/showcase/search.html +++ b/ckanext/showcase/templates/showcase/search.html @@ -34,7 +34,7 @@ (_('Last Modified'), 'metadata_modified desc'), (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ] %} - {% snippet 'showcase/snippets/showcase_search_form.html', type='showcase', placeholder=_('Search showcases...'), query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.params, error=c.query_error, fields=c.fields, no_bottom_border=true %} + {% snippet 'showcase/snippets/showcase_search_form.html', type='showcase', placeholder=_('Search showcases...'), query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.args, error=c.query_error, fields=c.fields, no_bottom_border=true %} {% endblock %} {% block package_search_results_list %} diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index 476c6a25..a42a7ad3 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -32,7 +32,7 @@ def check_edit_view_auth(id): 'session': model.Session, 'user': c.user or c.author, 'auth_user_obj': c.userobj, - 'save': 'save' in tk.request.params, + 'save': 'save' in tk.request.args, 'moderated': tk.config.get('moderated'), 'pending': True } @@ -52,7 +52,7 @@ def check_new_view_auth(): 'session': model.Session, 'user': tk.c.user or tk.c.author, 'auth_user_obj': tk.c.userobj, - 'save': 'save' in tk.request.params + 'save': 'save' in tk.request.args } # Check access here, then continue with PackageController.new() @@ -122,7 +122,7 @@ def manage_datasets_view(id): # Are we removing a showcase/dataset association? form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.params + '2.9') else tk.request.args if tk.check_ckan_version(min_version='2.9.0'): manage_route = 'showcase_blueprint.manage_datasets' @@ -308,14 +308,14 @@ def _add_dataset_search(showcase_id, showcase_name): package_type = 'dataset' # unicode format (decoded from utf8) - q = c.q = tk.request.params.get('q', u'') + q = c.q = tk.request.args.get('q', u'') c.query_error = False - page = h.get_page_number(tk.request.params) + page = h.get_page_number(tk.request.args) limit = int(tk.config.get('ckan.datasets_per_page', 20)) # most search operations should reset the page counter: - params_nopage = [(k, v) for k, v in tk.request.params.items() + params_nopage = [(k, v) for k, v in tk.request.args.items() if k != 'page'] def drill_down_url(alternative_url=None, **by): @@ -337,7 +337,7 @@ def remove_field(key, value=None, replace=None): c.remove_field = remove_field - sort_by = tk.request.params.get('sort', None) + sort_by = tk.request.args.get('sort', None) params_nosort = [(k, v) for k, v in params_nopage if k != 'sort'] def _sort_by(fields): @@ -377,7 +377,7 @@ def pager_url(q=None, page=None): c.fields_grouped = {} search_extras = {} fq = '' - for (param, value) in tk.request.params.items(): + for (param, value) in tk.request.args.items(): if param not in ['q', 'page', 'sort'] \ and len(value) and not param.startswith('_'): if not param.startswith('ext_'): @@ -479,7 +479,7 @@ def pager_url(q=None, page=None): for facet in c.search_facets.keys(): try: limit = int( - tk.request.params.get( + tk.request.args.get( '_%s_limit' % facet, int(tk.config.get('search.facets.default', 10)))) except tk.ValueError: @@ -505,7 +505,7 @@ def url_with_params(url, params): def delete_view(id): - if 'cancel' in tk.request.params: + if 'cancel' in tk.request.args: tk.redirect_to( 'showcase_blueprint.edit' if tk.check_ckan_version(min_version='2.9.0') else 'showcase_edit', id=id) @@ -577,7 +577,7 @@ def dataset_showcase_list(id): if tk.request.method == 'POST': # Are we adding the dataset to a showcase? form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.params + '2.9') else tk.request.args new_showcase = form_data.get('showcase_added') if new_showcase: @@ -636,7 +636,7 @@ def manage_showcase_admins(): return tk.abort(401, _('User not authorized to view page')) form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.params + '2.9') else tk.request.args if tk.check_ckan_version(min_version='2.9.0'): admins_route = 'showcase_blueprint.admins' @@ -683,7 +683,7 @@ def remove_showcase_admin(): return tk.abort(401, _('User not authorized to view page')) form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.params + '2.9') else tk.request.args if tk.check_ckan_version(min_version='2.9.0'): admins_route = 'showcase_blueprint.admins' @@ -693,9 +693,9 @@ def remove_showcase_admin(): if 'cancel' in form_data: return tk.redirect_to(admins_route) - user_id = tk.request.params['user'] + user_id = tk.request.args['user'] if tk.request.method == 'POST' and user_id: - user_id = tk.request.params['user'] + user_id = tk.request.args['user'] try: tk.get_action('ckanext_showcase_admin_remove')( {}, {'username': user_id} From e4ddba0d5ab4d5fb3c03dfa37a419cea4191fc73 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 18:13:15 -0300 Subject: [PATCH 16/77] Use plugins.toolkit --- ckanext/showcase/plugin/__init__.py | 3 +-- ckanext/showcase/views.py | 2 +- setup.py | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ckanext/showcase/plugin/__init__.py b/ckanext/showcase/plugin/__init__.py index 4993c455..fa3cf0e9 100644 --- a/ckanext/showcase/plugin/__init__.py +++ b/ckanext/showcase/plugin/__init__.py @@ -9,11 +9,10 @@ from six import string_types import ckan.plugins as plugins +import ckan.plugins.toolkit as tk import ckan.lib.plugins as lib_plugins import ckan.lib.helpers as h -import ckantoolkit as tk - import ckanext.showcase.utils as utils from ckanext.showcase.logic import auth, action diff --git a/ckanext/showcase/views.py b/ckanext/showcase/views.py index f969e5ea..b19b2454 100644 --- a/ckanext/showcase/views.py +++ b/ckanext/showcase/views.py @@ -2,9 +2,9 @@ from flask import Blueprint -import ckantoolkit as tk import ckan.lib.helpers as h +import ckan.plugins.toolkit as tk import ckan.views.dataset as dataset import ckanext.showcase.utils as utils diff --git a/setup.py b/setup.py index 89b2fef8..8672b57a 100644 --- a/setup.py +++ b/setup.py @@ -56,7 +56,6 @@ # requirements files see: # https://packaging.python.org/en/latest/technical.html#install-requires-vs-requirements-files install_requires=[ - 'ckantoolkit>=0.0.3', 'six>=1.12.0' ], From 8bcab93eb0d3db98f11e0f08f8b3e1fe77543e21 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 8 Apr 2022 18:24:38 -0300 Subject: [PATCH 17/77] Keep request.params for backwards compatibility --- .../templates/showcase/add_datasets.html | 2 +- .../templates/showcase/manage_datasets.html | 2 +- .../showcase/templates/showcase/search.html | 2 +- ckanext/showcase/utils.py | 30 +++++++++---------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/ckanext/showcase/templates/showcase/add_datasets.html b/ckanext/showcase/templates/showcase/add_datasets.html index 956b4c9e..a2693ed5 100644 --- a/ckanext/showcase/templates/showcase/add_datasets.html +++ b/ckanext/showcase/templates/showcase/add_datasets.html @@ -24,7 +24,7 @@ (_('Last Modified'), 'metadata_modified desc'), (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ] %} - {% snippet 'snippets/search_form.html', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.args, error=c.query_error, fields=c.fields %} + {% snippet 'snippets/search_form.html', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.params, error=c.query_error, fields=c.fields %} {% endblock %}

    {% block page_heading %} diff --git a/ckanext/showcase/templates/showcase/manage_datasets.html b/ckanext/showcase/templates/showcase/manage_datasets.html index 1da677ae..b1da5c6e 100644 --- a/ckanext/showcase/templates/showcase/manage_datasets.html +++ b/ckanext/showcase/templates/showcase/manage_datasets.html @@ -27,7 +27,7 @@ (_('Last Modified'), 'metadata_modified desc'), (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ] %} - {% snippet 'snippets/search_form.html', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.args, error=c.query_error, fields=c.fields %} + {% snippet 'snippets/search_form.html', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.params, error=c.query_error, fields=c.fields %}

    diff --git a/ckanext/showcase/templates/showcase/search.html b/ckanext/showcase/templates/showcase/search.html index 74da27bb..b975a013 100644 --- a/ckanext/showcase/templates/showcase/search.html +++ b/ckanext/showcase/templates/showcase/search.html @@ -34,7 +34,7 @@ (_('Last Modified'), 'metadata_modified desc'), (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ] %} - {% snippet 'showcase/snippets/showcase_search_form.html', type='showcase', placeholder=_('Search showcases...'), query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.args, error=c.query_error, fields=c.fields, no_bottom_border=true %} + {% snippet 'showcase/snippets/showcase_search_form.html', type='showcase', placeholder=_('Search showcases...'), query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.params, error=c.query_error, fields=c.fields, no_bottom_border=true %} {% endblock %} {% block package_search_results_list %} diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index a42a7ad3..476c6a25 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -32,7 +32,7 @@ def check_edit_view_auth(id): 'session': model.Session, 'user': c.user or c.author, 'auth_user_obj': c.userobj, - 'save': 'save' in tk.request.args, + 'save': 'save' in tk.request.params, 'moderated': tk.config.get('moderated'), 'pending': True } @@ -52,7 +52,7 @@ def check_new_view_auth(): 'session': model.Session, 'user': tk.c.user or tk.c.author, 'auth_user_obj': tk.c.userobj, - 'save': 'save' in tk.request.args + 'save': 'save' in tk.request.params } # Check access here, then continue with PackageController.new() @@ -122,7 +122,7 @@ def manage_datasets_view(id): # Are we removing a showcase/dataset association? form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.args + '2.9') else tk.request.params if tk.check_ckan_version(min_version='2.9.0'): manage_route = 'showcase_blueprint.manage_datasets' @@ -308,14 +308,14 @@ def _add_dataset_search(showcase_id, showcase_name): package_type = 'dataset' # unicode format (decoded from utf8) - q = c.q = tk.request.args.get('q', u'') + q = c.q = tk.request.params.get('q', u'') c.query_error = False - page = h.get_page_number(tk.request.args) + page = h.get_page_number(tk.request.params) limit = int(tk.config.get('ckan.datasets_per_page', 20)) # most search operations should reset the page counter: - params_nopage = [(k, v) for k, v in tk.request.args.items() + params_nopage = [(k, v) for k, v in tk.request.params.items() if k != 'page'] def drill_down_url(alternative_url=None, **by): @@ -337,7 +337,7 @@ def remove_field(key, value=None, replace=None): c.remove_field = remove_field - sort_by = tk.request.args.get('sort', None) + sort_by = tk.request.params.get('sort', None) params_nosort = [(k, v) for k, v in params_nopage if k != 'sort'] def _sort_by(fields): @@ -377,7 +377,7 @@ def pager_url(q=None, page=None): c.fields_grouped = {} search_extras = {} fq = '' - for (param, value) in tk.request.args.items(): + for (param, value) in tk.request.params.items(): if param not in ['q', 'page', 'sort'] \ and len(value) and not param.startswith('_'): if not param.startswith('ext_'): @@ -479,7 +479,7 @@ def pager_url(q=None, page=None): for facet in c.search_facets.keys(): try: limit = int( - tk.request.args.get( + tk.request.params.get( '_%s_limit' % facet, int(tk.config.get('search.facets.default', 10)))) except tk.ValueError: @@ -505,7 +505,7 @@ def url_with_params(url, params): def delete_view(id): - if 'cancel' in tk.request.args: + if 'cancel' in tk.request.params: tk.redirect_to( 'showcase_blueprint.edit' if tk.check_ckan_version(min_version='2.9.0') else 'showcase_edit', id=id) @@ -577,7 +577,7 @@ def dataset_showcase_list(id): if tk.request.method == 'POST': # Are we adding the dataset to a showcase? form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.args + '2.9') else tk.request.params new_showcase = form_data.get('showcase_added') if new_showcase: @@ -636,7 +636,7 @@ def manage_showcase_admins(): return tk.abort(401, _('User not authorized to view page')) form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.args + '2.9') else tk.request.params if tk.check_ckan_version(min_version='2.9.0'): admins_route = 'showcase_blueprint.admins' @@ -683,7 +683,7 @@ def remove_showcase_admin(): return tk.abort(401, _('User not authorized to view page')) form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.args + '2.9') else tk.request.params if tk.check_ckan_version(min_version='2.9.0'): admins_route = 'showcase_blueprint.admins' @@ -693,9 +693,9 @@ def remove_showcase_admin(): if 'cancel' in form_data: return tk.redirect_to(admins_route) - user_id = tk.request.args['user'] + user_id = tk.request.params['user'] if tk.request.method == 'POST' and user_id: - user_id = tk.request.args['user'] + user_id = tk.request.params['user'] try: tk.get_action('ckanext_showcase_admin_remove')( {}, {'username': user_id} From 1db1e869194d920b58d75d2dfe0aad343840d2ba Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 15 Apr 2022 18:50:20 +0200 Subject: [PATCH 18/77] Clean log_message logic --- ckanext/showcase/controller.py | 1 - ckanext/showcase/logic/schema.py | 2 -- ckanext/showcase/views.py | 1 - 3 files changed, 4 deletions(-) diff --git a/ckanext/showcase/controller.py b/ckanext/showcase/controller.py index d0ad1272..04151918 100644 --- a/ckanext/showcase/controller.py +++ b/ckanext/showcase/controller.py @@ -61,7 +61,6 @@ def _save_new(self, context, package_type=None): dict_fns.unflatten(tuplize_dict(parse_params(request.POST)))) data_dict['type'] = package_type - context['message'] = data_dict.get('log_message', '') try: pkg_dict = get_action('ckanext_showcase_create')(context, diff --git a/ckanext/showcase/logic/schema.py b/ckanext/showcase/logic/schema.py index 3c9b953d..30d4040a 100644 --- a/ckanext/showcase/logic/schema.py +++ b/ckanext/showcase/logic/schema.py @@ -29,7 +29,6 @@ package_name_validator = toolkit.get_validator("package_name_validator") tag_string_convert = toolkit.get_validator("tag_string_convert") ignore_not_package_admin = toolkit.get_validator("ignore_not_package_admin") -no_http = toolkit.get_validator("no_http") url_validator = toolkit.get_validator("url_validator") def showcase_base_schema(): @@ -44,7 +43,6 @@ def showcase_base_schema(): 'url': [ignore_missing, url_validator], 'state': [ignore_not_package_admin, ignore_missing], 'type': [ignore_missing, unicode_safe], - 'log_message': [ignore_missing, unicode_safe, no_http], '__extras': [ignore], '__junk': [empty], 'resources': default_resource_schema(), diff --git a/ckanext/showcase/views.py b/ckanext/showcase/views.py index b19b2454..a50fc5b1 100644 --- a/ckanext/showcase/views.py +++ b/ckanext/showcase/views.py @@ -34,7 +34,6 @@ def post(self): tk.request.files))))) context = self._prepare() data_dict['type'] = utils.DATASET_TYPE_NAME - context['message'] = data_dict.get('log_message', '') try: pkg_dict = tk.get_action('ckanext_showcase_create')(context, From 855604e79a274afb7e57eb70a833f2477866e288 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 15 Apr 2022 19:05:45 +0200 Subject: [PATCH 19/77] Deprecate logic to migrate from Related Items --- README.rst | 30 -------- ckanext/showcase/commands/cli.py | 11 --- ckanext/showcase/commands/paster.py | 24 +------ ckanext/showcase/utils.py | 104 ---------------------------- 4 files changed, 2 insertions(+), 167 deletions(-) diff --git a/README.rst b/README.rst index 0ae4c8fb..db3f856b 100644 --- a/README.rst +++ b/README.rst @@ -33,12 +33,6 @@ Requirements Compatible with CKAN 2.9. -N.B. The ``migrate`` command, detailed below, requires the Related Item models -and actions, which have been removed in CKAN 2.6. If you wish to migrate your -Related Items, please first upgrade CKAN to 2.5, do the migration, then -continue upgrading to CKAN 2.6+. - - ------------ Installation ------------ @@ -157,30 +151,6 @@ The Showcase extension adds the following pages to the user interface: * To add a Showcase Admin : ``http://127.0.0.1:5000/ckan-admin/showcase_admins`` ----------------------------- -Migrating from Related Items ----------------------------- - -If you already have Related Items in your database, you can use the ``showcase -migrate`` command to create Showcases from Related Items. - -From the ``ckanext-showcase`` directory:: - - paster showcase migrate -c {path to production.ini} - -Note that each Related Item must have a unique title before migration can -proceed. If you prefer resolving duplicates as showcases, you can use the --allow-duplicates -option to migrate them anyways. Duplicate Relations will be created as -'duplicate\_' + original_related_title + '_' + related_id - - paster showcase migrate -c {path to production.ini} --allow-duplicates - -The Related Item property ``type`` will become a Showcase tag. The Related Item -properties ``created``, ``owner_id``, ``view_count``, and ``featured`` have no -equivalent in Showcases and will not be migrated. - -Related Item data is not removed from the database by this command. - --------------------- Configuration --------------------- diff --git a/ckanext/showcase/commands/cli.py b/ckanext/showcase/commands/cli.py index 4df2423f..7d1d7385 100644 --- a/ckanext/showcase/commands/cli.py +++ b/ckanext/showcase/commands/cli.py @@ -14,17 +14,6 @@ def showcase(): pass -@showcase.command() -@click.option('--allow-duplicates', - default=False, - help='Allow related items with duplicate titles to be migrated. Duplicate showcases will be created as "duplicate__".') -def migrate(allow_duplicates): - """ - showcase migrate [options] - """ - utils.migrate(allow_duplicates) - - @showcase.command() def markdown_to_html(): ''' diff --git a/ckanext/showcase/commands/paster.py b/ckanext/showcase/commands/paster.py index c58a63fe..d1c751c7 100644 --- a/ckanext/showcase/commands/paster.py +++ b/ckanext/showcase/commands/paster.py @@ -11,16 +11,10 @@ class MigrationCommand(CkanCommand): ''' - CKAN 'Related Items' to 'Showcase' migration command. + ckanext-showcase migration command. Usage:: - paster showcase migrate -c - - Migrate Related Items to Showcases - - paster showcase migrate -c [--allow-duplicates] - - Migrate Related Items to Showcases and allow duplicates - paster showcase markdown-to-html -c - Migrate the notes of all showcases from markdown to html. @@ -32,15 +26,6 @@ class MigrationCommand(CkanCommand): def __init__(self, name): super(CkanCommand, self).__init__(name) - self.parser.add_option('--allow-duplicates', - dest='allow_duplicates', - default=False, - help='''Use this option to allow - related items with duplicate titles to be migrated. - Duplicate showcases will be created as - 'duplicate__'.''', - action='store_true') - def command(self): ''' Parse command line arguments and call appropriate method. @@ -52,15 +37,10 @@ def command(self): cmd = self.args[0] self._load_config() - if cmd == 'migrate': - self.migrate() - elif cmd == 'markdown-to-html': + if cmd == 'markdown-to-html': self.markdown_to_html() else: print('Command "{0}" not recognized'.format(cmd)) - def migrate(self): - utils.migrate(self.options.allow_duplicates) - def markdown_to_html(self): utils.markdown_to_html() diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index 476c6a25..359bcdc3 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -194,110 +194,6 @@ def manage_datasets_view(id): return tk.render('showcase/manage_datasets.html') - -def migrate(allow_duplicates): - related_items = tk.get_action('related_list')({}, {}) - - # preflight: - # related items must have unique titles before migration - related_titles = [i['title'] for i in related_items] - # make a list of duplicate titles - duplicate_titles = _find_duplicates(related_titles) - if duplicate_titles and allow_duplicates is False: - print( - """All Related Items must have unique titles before migration. The following -Related Item titles are used more than once and need to be corrected before -migration can continue. Please correct and try again:""") - for i in duplicate_titles: - print(i) - return - - for related in related_items: - existing_showcase = tk.get_action('package_search')({}, { - 'fq': - '+dataset_type:showcase original_related_item_id:{0}'.format( - related['id']) - }) - normalized_title = substitute_ascii_equivalents(related['title']) - if existing_showcase['count'] > 0: - print('Showcase for Related Item "{0}" already exists.'.format( - normalized_title)) - else: - showcase_title = _gen_new_title(related.get('title'), - related['id']) - data_dict = { - 'original_related_item_id': related.get('id'), - 'title': showcase_title, - 'name': munge_title_to_name(showcase_title), - 'notes': related.get('description'), - 'image_url': related.get('image_url'), - 'url': related.get('url'), - 'tags': [{ - "name": related.get('type').lower() - }] - } - # make the showcase - try: - new_showcase = tk.get_action('ckanext_showcase_create')( - {}, data_dict - ) - except Exception as e: - print('There was a problem migrating "{0}": {1}'.format( - normalized_title, e)) - else: - print('Created Showcase from the Related Item "{0}"'.format( - normalized_title)) - - # make the showcase_package_association, if needed - try: - related_pkg_id = _get_related_dataset(related['id']) - if related_pkg_id: - tk.get_action( - 'ckanext_showcase_package_association_create')( - {}, - { - 'showcase_id': new_showcase['id'], - 'package_id': related_pkg_id - }) - except Exception as e: - print( - 'There was a problem creating the showcase_package_association for "{0}": {1}' - .format(normalized_title, e)) - - -def _get_related_dataset(related_id): - '''Get the id of a package from related_dataset, if one exists.''' - related_dataset = model.Session.query( - model.RelatedDataset).filter_by(related_id=related_id).first() - if related_dataset: - return related_dataset.dataset_id - - -def _find_duplicates(lst): - '''From a list, return a set of duplicates. - - >>> MigrationCommand('cmd')._find_duplicates([1, 2, 3, 4, 5]) - [] - - >>> MigrationCommand('cmd')._find_duplicates([1, 2, 3, 4, 3, 1, 1]) - [1, 3] - - >>> MigrationCommand('cmd')._find_duplicates(['one', 'two', 'three', 'four', 'two', 'three']) - ['two', 'three'] - ''' - return list(set(x for x in lst if lst.count(x) >= 2)) - - -def _gen_new_title(title, related_id): - name = munge_title_to_name(title) - pkg_obj = model.Session.query(model.Package).filter_by(name=name).first() - if pkg_obj: - title.replace('duplicate_', '') - return 'duplicate_' + title + '_' + related_id - else: - return title - - def _add_dataset_search(showcase_id, showcase_name): ''' Search logic for discovering datasets to add to a showcase. From 45c68f02f5432a6907ccd1e457ac3581b5e6bbd4 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 15 Apr 2022 19:15:57 +0200 Subject: [PATCH 20/77] Clean leftover of related items --- ckanext/showcase/logic/schema.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ckanext/showcase/logic/schema.py b/ckanext/showcase/logic/schema.py index 30d4040a..7d8f752d 100644 --- a/ckanext/showcase/logic/schema.py +++ b/ckanext/showcase/logic/schema.py @@ -52,10 +52,7 @@ def showcase_base_schema(): 'save': [ignore], 'return_to': [ignore], 'image_url': [toolkit.get_validator('ignore_missing'), - toolkit.get_converter('convert_to_extras')], - 'original_related_item_id': [ - toolkit.get_validator('ignore_missing'), - toolkit.get_converter('convert_to_extras')] + toolkit.get_converter('convert_to_extras')] } return schema From 2555f0d2a25195d812f6759d543e08b93ed6b1be Mon Sep 17 00:00:00 2001 From: pdelboca Date: Fri, 15 Apr 2022 19:17:40 +0200 Subject: [PATCH 21/77] Clean old drill_down_url --- ckanext/showcase/utils.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index 359bcdc3..f0294491 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -214,15 +214,6 @@ def _add_dataset_search(showcase_id, showcase_name): params_nopage = [(k, v) for k, v in tk.request.params.items() if k != 'page'] - def drill_down_url(alternative_url=None, **by): - return h.add_url_param(alternative_url=alternative_url, - controller='dataset' - if tk.check_ckan_version('2.9') else 'package', - action='search', - new_params=by) - - c.drill_down_url = drill_down_url - def remove_field(key, value=None, replace=None): return h.remove_url_param(key, value=value, @@ -609,6 +600,7 @@ def remove_showcase_admin(): c.user_id = user_id return tk.render('admin/confirm_remove_showcase_admin.html') + def markdown_to_html(): ''' Migrates the notes of all showcases from markdown to html. From 68211c63c46d171788b4f616f6eabc7340971bec Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 10:47:01 +0200 Subject: [PATCH 22/77] Copy logic from core --- ckanext/showcase/utils.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index f0294491..03d9f5b5 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -285,15 +285,25 @@ def pager_url(q=None, page=None): 'auth_user_obj': c.userobj } - if package_type and package_type != 'dataset': + # Unless changed via config options, don't show other dataset + # types any search page. Potential alternatives are do show them + # on the default search page (dataset) or on one other search page + search_all_type = tk.config.get_value(u'ckan.search.show_all_types') + search_all = False + + try: + # If the "type" is set to True or False, convert to bool + # and we know that no type was specified, so use traditional + # behaviour of applying this only to dataset type + search_all = tk.asbool(search_all_type) + search_all_type = u'dataset' + # Otherwise we treat as a string representing a type + except ValueError: + search_all = True + + if not search_all or package_type != search_all_type: # Only show datasets of this particular type - fq += ' +dataset_type:{type}'.format(type=package_type) - else: - # Unless changed via config options, don't show non standard - # dataset types on the default search page - if not tk.asbool( - tk.config.get('ckan.search.show_all_types', 'False')): - fq += ' +dataset_type:dataset' + fq += u' +dataset_type:{type}'.format(type=package_type) # Only search for packages that aren't already associated with the # Showcase From 2754d7ea1d0c25647619a8826412a732b40b9737 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 10:52:46 +0200 Subject: [PATCH 23/77] Clean old moderated context value --- ckanext/showcase/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index 03d9f5b5..e408cddd 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -33,7 +33,6 @@ def check_edit_view_auth(id): 'user': c.user or c.author, 'auth_user_obj': c.userobj, 'save': 'save' in tk.request.params, - 'moderated': tk.config.get('moderated'), 'pending': True } From 8fce295f7ccc9edf9a678bf9df461845cc6d8416 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 10:56:54 +0200 Subject: [PATCH 24/77] Fix config object access --- ckanext/showcase/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index e408cddd..b8956ff9 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -287,7 +287,7 @@ def pager_url(q=None, page=None): # Unless changed via config options, don't show other dataset # types any search page. Potential alternatives are do show them # on the default search page (dataset) or on one other search page - search_all_type = tk.config.get_value(u'ckan.search.show_all_types') + search_all_type = tk.config.get('ckan.search.show_all_types') search_all = False try: @@ -295,14 +295,14 @@ def pager_url(q=None, page=None): # and we know that no type was specified, so use traditional # behaviour of applying this only to dataset type search_all = tk.asbool(search_all_type) - search_all_type = u'dataset' + search_all_type = 'dataset' # Otherwise we treat as a string representing a type except ValueError: search_all = True if not search_all or package_type != search_all_type: # Only show datasets of this particular type - fq += u' +dataset_type:{type}'.format(type=package_type) + fq += ' +dataset_type:{type}'.format(type=package_type) # Only search for packages that aren't already associated with the # Showcase From 32c56e72ba29cce03db552dcb1be4af123d8f9fd Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 11:59:02 +0200 Subject: [PATCH 25/77] Simplify IPackageController logic --- ckanext/showcase/plugin/__init__.py | 97 ++++++++++++++--------------- 1 file changed, 46 insertions(+), 51 deletions(-) diff --git a/ckanext/showcase/plugin/__init__.py b/ckanext/showcase/plugin/__init__.py index fa3cf0e9..ff36a0da 100644 --- a/ckanext/showcase/plugin/__init__.py +++ b/ckanext/showcase/plugin/__init__.py @@ -175,58 +175,53 @@ def _add_to_pkg_dict(self, context, pkg_dict): return pkg_dict + # CKAN >= 2.10 + def after_dataset_show(self, context, pkg_dict): + ''' + Modify package_show pkg_dict. + ''' + pkg_dict = self._add_to_pkg_dict(context, pkg_dict) + + def before_dataset_view(self, pkg_dict): + ''' + Modify pkg_dict that is sent to templates. + ''' + context = {'user': tk.g.user or tk.g.author} + + return self._add_to_pkg_dict(context, pkg_dict) + + def before_dataset_search(self, search_params): + ''' + Unless the query is already being filtered by this dataset_type + (either positively, or negatively), exclude datasets of type + `showcase`. + ''' + fq = search_params.get('fq', '') + filter = 'dataset_type:{0}'.format(DATASET_TYPE_NAME) + if filter not in fq: + search_params.update({'fq': fq + " -" + filter}) + return search_params + + # CKAN < 2.10 (Remove when dropping support for 2.9) + def after_show(self, context, pkg_dict): + ''' + Modify package_show pkg_dict. + ''' + pkg_dict = self.after_dataset_show(context, pkg_dict) + + def before_view(self, pkg_dict): + ''' + Modify pkg_dict that is sent to templates. + ''' + return self.before_dataset_view(pkg_dict) - if tk.check_ckan_version("2.10"): - def after_dataset_show(self, context, pkg_dict): - ''' - Modify package_show pkg_dict. - ''' - pkg_dict = self._add_to_pkg_dict(context, pkg_dict) - - def before_dataset_view(self, pkg_dict): - ''' - Modify pkg_dict that is sent to templates. - ''' - context = {'user': tk.g.user or tk.g.author} - - return self._add_to_pkg_dict(context, pkg_dict) - - def before_dataset_search(self, search_params): - ''' - Unless the query is already being filtered by this dataset_type - (either positively, or negatively), exclude datasets of type - `showcase`. - ''' - fq = search_params.get('fq', '') - filter = 'dataset_type:{0}'.format(DATASET_TYPE_NAME) - if filter not in fq: - search_params.update({'fq': fq + " -" + filter}) - return search_params - else: - def after_show(self, context, pkg_dict): - ''' - Modify package_show pkg_dict. - ''' - pkg_dict = self._add_to_pkg_dict(context, pkg_dict) - - def before_view(self, pkg_dict): - ''' - Modify pkg_dict that is sent to templates. - ''' - context = {'user': tk.g.user or tk.g.author} - return self._add_to_pkg_dict(context, pkg_dict) - - def before_search(self, search_params): - ''' - Unless the query is already being filtered by this dataset_type - (either positively, or negatively), exclude datasets of type - `showcase`. - ''' - fq = search_params.get('fq', '') - filter = 'dataset_type:{0}'.format(DATASET_TYPE_NAME) - if filter not in fq: - search_params.update({'fq': fq + " -" + filter}) - return search_params + def before_search(self, search_params): + ''' + Unless the query is already being filtered by this dataset_type + (either positively, or negatively), exclude datasets of type + `showcase`. + ''' + return self.before_dataset_search(search_params) # ITranslation def i18n_directory(self): From 1d58e7e01e99b611be6189f6e7e93348fa9e5f73 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 12:12:12 +0200 Subject: [PATCH 26/77] Simplify context objects --- ckanext/showcase/utils.py | 81 +++++++-------------------------------- 1 file changed, 13 insertions(+), 68 deletions(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index b8956ff9..f510b368 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -28,10 +28,6 @@ def check_edit_view_auth(id): context = { - 'model': model, - 'session': model.Session, - 'user': c.user or c.author, - 'auth_user_obj': c.userobj, 'save': 'save' in tk.request.params, 'pending': True } @@ -47,10 +43,6 @@ def check_edit_view_auth(id): def check_new_view_auth(): context = { - 'model': model, - 'session': model.Session, - 'user': tk.c.user or tk.c.author, - 'auth_user_obj': tk.c.userobj, 'save': 'save' in tk.request.params } @@ -66,13 +58,7 @@ def check_new_view_auth(): def read_view(id): - context = { - 'model': model, - 'session': model.Session, - 'user': c.user or c.author, - 'for_view': True, - 'auth_user_obj': c.userobj - } + context = {'for_view': True} data_dict = {'id': id} # check if showcase exists @@ -96,11 +82,7 @@ def read_view(id): def manage_datasets_view(id): - context = { - 'model': model, - 'session': model.Session, - 'user': tk.c.user or tk.c.author - } + context = {} data_dict = {'id': id} try: @@ -276,13 +258,7 @@ def pager_url(q=None, page=None): else: search_extras[param] = value - context = { - 'model': model, - 'session': model.Session, - 'user': c.user or c.author, - 'for_view': True, - 'auth_user_obj': c.userobj - } + context = {'for_view': True} # Unless changed via config options, don't show other dataset # types any search page. Potential alternatives are do show them @@ -406,15 +382,8 @@ def delete_view(id): 'showcase_blueprint.edit' if tk.check_ckan_version(min_version='2.9.0') else 'showcase_edit', id=id) - context = { - 'model': model, - 'session': model.Session, - 'user': c.user or c.author, - 'auth_user_obj': c.userobj - } - try: - tk.check_access('ckanext_showcase_delete', context, {'id': id}) + tk.check_access('ckanext_showcase_delete', {}, {'id': id}) except tk.NotAuthorized: return tk.abort(401, _('Unauthorized to delete showcase')) @@ -425,10 +394,10 @@ def delete_view(id): try: if tk.request.method == 'POST': - tk.get_action('ckanext_showcase_delete')(context, {'id': id}) + tk.get_action('ckanext_showcase_delete')({}, {'id': id}) h.flash_notice(_('Showcase has been deleted.')) return tk.redirect_to(index_route) - c.pkg_dict = tk.get_action('package_show')(context, {'id': id}) + c.pkg_dict = tk.get_action('package_show')({}, {'id': id}) except tk.NotAuthorized: tk.abort(401, _('Unauthorized to delete showcase')) except tk.ObjectNotFound: @@ -438,13 +407,7 @@ def delete_view(id): def dataset_showcase_list(id): - context = { - 'model': model, - 'session': model.Session, - 'user': c.user or c.author, - 'for_view': True, - 'auth_user_obj': c.userobj - } + context = {'for_view': True} data_dict = {'id': id} try: @@ -520,14 +483,8 @@ def dataset_showcase_list(id): def manage_showcase_admins(): - context = { - 'model': model, - 'session': model.Session, - 'user': c.user or c.author - } - try: - tk.check_access('sysadmin', context, {}) + tk.check_access('sysadmin', {}, {}) except tk.NotAuthorized: return tk.abort(401, _('User not authorized to view page')) @@ -567,14 +524,8 @@ def remove_showcase_admin(): ''' Remove a user from the Showcase Admin list. ''' - context = { - 'model': model, - 'session': model.Session, - 'user': c.user or c.author - } - try: - tk.check_access('sysadmin', context, {}) + tk.check_access('sysadmin', {}, {}) except tk.NotAuthorized: return tk.abort(401, _('User not authorized to view page')) @@ -619,17 +570,11 @@ def markdown_to_html(): ''' showcases = tk.get_action('ckanext_showcase_list')({},{}) - site_user = tk.get_action('get_site_user')({ - 'model': model, - 'ignore_auth': True}, + site_user = tk.get_action('get_site_user')( + {'ignore_auth': True}, {} ) - context = { - 'model': model, - 'session': model.Session, - 'ignore_auth': True, - 'user': site_user['name'], - } + context = {'ignore_auth': True, 'user': site_user['name']} for showcase in showcases: tk.get_action('package_patch')( @@ -659,7 +604,7 @@ def upload(): try: url = tk.get_action('ckanext_showcase_upload')( - None, + {}, data_dict ) except tk.NotAuthorized: From de10d0a58a165463159b8a362bcb2f6eadcc4210 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 12:12:27 +0200 Subject: [PATCH 27/77] Clean unused imports --- ckanext/showcase/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index f510b368..7e753bbb 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -10,7 +10,6 @@ import ckan.plugins as p from ckan import model -from ckan.lib.munge import munge_title_to_name, substitute_ascii_equivalents import ckan.logic as logic import ckan.lib.navl.dictization_functions as dict_fns import ckan.lib.helpers as h From 028b8d0299a720fbd17fd710648549b23468a83d Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 12:12:56 +0200 Subject: [PATCH 28/77] Clean not accessed import --- ckanext/showcase/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index 7e753bbb..c5c1a320 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -9,7 +9,6 @@ from six.moves.urllib.parse import urlencode import ckan.plugins as p -from ckan import model import ckan.logic as logic import ckan.lib.navl.dictization_functions as dict_fns import ckan.lib.helpers as h From 19aaaf48f16ee8186e2c03d0a2ed873ff6fd986f Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 12:18:34 +0200 Subject: [PATCH 29/77] _prepare() do not have argument --- ckanext/showcase/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ckanext/showcase/views.py b/ckanext/showcase/views.py index a50fc5b1..f054085a 100644 --- a/ckanext/showcase/views.py +++ b/ckanext/showcase/views.py @@ -70,7 +70,7 @@ def get(self, id, data=None, errors=None, error_summary=None): errors, error_summary) def post(self, id): - context = self._prepare(id) + context = self._prepare() utils.check_edit_view_auth(id) data_dict = dataset.clean_dict( From 478b6813e306445c17b770ee4897082950ee3548 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 12:33:20 +0200 Subject: [PATCH 30/77] Keep user for check_access --- ckanext/showcase/utils.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index c5c1a320..9b9a4934 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -26,6 +26,7 @@ def check_edit_view_auth(id): context = { + 'user': tk.g.user, 'save': 'save' in tk.request.params, 'pending': True } @@ -41,6 +42,7 @@ def check_edit_view_auth(id): def check_new_view_auth(): context = { + 'user': tk.g.user, 'save': 'save' in tk.request.params } @@ -80,7 +82,7 @@ def read_view(id): def manage_datasets_view(id): - context = {} + context = {'user': tk.g.user} data_dict = {'id': id} try: @@ -405,7 +407,10 @@ def delete_view(id): def dataset_showcase_list(id): - context = {'for_view': True} + context = { + 'user': tk.g.user, + 'for_view': True + } data_dict = {'id': id} try: From 0d569e0d7fbbbbf4afdf3446590c9b204bb104d9 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 12:45:37 +0200 Subject: [PATCH 31/77] Restore user for auth_check --- ckanext/showcase/utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index 9b9a4934..28b9637d 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -382,8 +382,10 @@ def delete_view(id): 'showcase_blueprint.edit' if tk.check_ckan_version(min_version='2.9.0') else 'showcase_edit', id=id) + context = {'user': tk.g.user} + try: - tk.check_access('ckanext_showcase_delete', {}, {'id': id}) + tk.check_access('ckanext_showcase_delete', context, {'id': id}) except tk.NotAuthorized: return tk.abort(401, _('Unauthorized to delete showcase')) From 3fe625ec52773443c40553ed1e4fff1fda95d8e2 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 12:47:56 +0200 Subject: [PATCH 32/77] Do not check for auth twice --- ckanext/showcase/utils.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index 28b9637d..c8ea933a 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -382,21 +382,15 @@ def delete_view(id): 'showcase_blueprint.edit' if tk.check_ckan_version(min_version='2.9.0') else 'showcase_edit', id=id) - context = {'user': tk.g.user} - - try: - tk.check_access('ckanext_showcase_delete', context, {'id': id}) - except tk.NotAuthorized: - return tk.abort(401, _('Unauthorized to delete showcase')) - if tk.check_ckan_version(min_version='2.9.0'): index_route = 'showcase_blueprint.index' else: index_route = 'showcase_index' + context = {'user': tk.g.user} try: if tk.request.method == 'POST': - tk.get_action('ckanext_showcase_delete')({}, {'id': id}) + tk.get_action('ckanext_showcase_delete')(context, {'id': id}) h.flash_notice(_('Showcase has been deleted.')) return tk.redirect_to(index_route) c.pkg_dict = tk.get_action('package_show')({}, {'id': id}) @@ -404,6 +398,7 @@ def delete_view(id): tk.abort(401, _('Unauthorized to delete showcase')) except tk.ObjectNotFound: tk.abort(404, _('Showcase not found')) + return tk.render('showcase/confirm_delete.html', extra_vars={'dataset_type': DATASET_TYPE_NAME}) From 433683a03fc0f0045037ca7ede004e5d76287690 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 13:02:55 +0200 Subject: [PATCH 33/77] Revert "Simplify context objects" This reverts commit 1d58e7e01e99b611be6189f6e7e93348fa9e5f73. --- ckanext/showcase/utils.py | 86 ++++++++++++++++++++++++++++++++------- 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index c8ea933a..1e11d0d3 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -8,6 +8,7 @@ import six from six.moves.urllib.parse import urlencode +import ckan.model as model import ckan.plugins as p import ckan.logic as logic import ckan.lib.navl.dictization_functions as dict_fns @@ -26,7 +27,10 @@ def check_edit_view_auth(id): context = { - 'user': tk.g.user, + 'model': model, + 'session': model.Session, + 'user': c.user or c.author, + 'auth_user_obj': c.userobj, 'save': 'save' in tk.request.params, 'pending': True } @@ -42,7 +46,10 @@ def check_edit_view_auth(id): def check_new_view_auth(): context = { - 'user': tk.g.user, + 'model': model, + 'session': model.Session, + 'user': tk.c.user or tk.c.author, + 'auth_user_obj': tk.c.userobj, 'save': 'save' in tk.request.params } @@ -58,7 +65,13 @@ def check_new_view_auth(): def read_view(id): - context = {'for_view': True} + context = { + 'model': model, + 'session': model.Session, + 'user': c.user or c.author, + 'for_view': True, + 'auth_user_obj': c.userobj + } data_dict = {'id': id} # check if showcase exists @@ -82,7 +95,11 @@ def read_view(id): def manage_datasets_view(id): - context = {'user': tk.g.user} + context = { + 'model': model, + 'session': model.Session, + 'user': tk.c.user or tk.c.author + } data_dict = {'id': id} try: @@ -258,7 +275,13 @@ def pager_url(q=None, page=None): else: search_extras[param] = value - context = {'for_view': True} + context = { + 'model': model, + 'session': model.Session, + 'user': c.user or c.author, + 'for_view': True, + 'auth_user_obj': c.userobj + } # Unless changed via config options, don't show other dataset # types any search page. Potential alternatives are do show them @@ -382,6 +405,18 @@ def delete_view(id): 'showcase_blueprint.edit' if tk.check_ckan_version(min_version='2.9.0') else 'showcase_edit', id=id) + context = { + 'model': model, + 'session': model.Session, + 'user': c.user or c.author, + 'auth_user_obj': c.userobj + } + + try: + tk.check_access('ckanext_showcase_delete', context, {'id': id}) + except tk.NotAuthorized: + return tk.abort(401, _('Unauthorized to delete showcase')) + if tk.check_ckan_version(min_version='2.9.0'): index_route = 'showcase_blueprint.index' else: @@ -393,7 +428,7 @@ def delete_view(id): tk.get_action('ckanext_showcase_delete')(context, {'id': id}) h.flash_notice(_('Showcase has been deleted.')) return tk.redirect_to(index_route) - c.pkg_dict = tk.get_action('package_show')({}, {'id': id}) + c.pkg_dict = tk.get_action('package_show')(context, {'id': id}) except tk.NotAuthorized: tk.abort(401, _('Unauthorized to delete showcase')) except tk.ObjectNotFound: @@ -405,9 +440,12 @@ def delete_view(id): def dataset_showcase_list(id): context = { - 'user': tk.g.user, - 'for_view': True - } + 'model': model, + 'session': model.Session, + 'user': c.user or c.author, + 'for_view': True, + 'auth_user_obj': c.userobj + } data_dict = {'id': id} try: @@ -483,8 +521,14 @@ def dataset_showcase_list(id): def manage_showcase_admins(): + context = { + 'model': model, + 'session': model.Session, + 'user': c.user or c.author + } + try: - tk.check_access('sysadmin', {}, {}) + tk.check_access('sysadmin', context, {}) except tk.NotAuthorized: return tk.abort(401, _('User not authorized to view page')) @@ -524,8 +568,14 @@ def remove_showcase_admin(): ''' Remove a user from the Showcase Admin list. ''' + context = { + 'model': model, + 'session': model.Session, + 'user': c.user or c.author + } + try: - tk.check_access('sysadmin', {}, {}) + tk.check_access('sysadmin', context, {}) except tk.NotAuthorized: return tk.abort(401, _('User not authorized to view page')) @@ -570,11 +620,17 @@ def markdown_to_html(): ''' showcases = tk.get_action('ckanext_showcase_list')({},{}) - site_user = tk.get_action('get_site_user')( - {'ignore_auth': True}, + site_user = tk.get_action('get_site_user')({ + 'model': model, + 'ignore_auth': True}, {} ) - context = {'ignore_auth': True, 'user': site_user['name']} + context = { + 'model': model, + 'session': model.Session, + 'ignore_auth': True, + 'user': site_user['name'], + } for showcase in showcases: tk.get_action('package_patch')( @@ -604,7 +660,7 @@ def upload(): try: url = tk.get_action('ckanext_showcase_upload')( - {}, + None, data_dict ) except tk.NotAuthorized: From f2f1fd37cfdc36275e5c98aa689c0c3dbc742b5c Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 14:15:26 +0200 Subject: [PATCH 34/77] Upgrade c to g --- ckanext/showcase/utils.py | 129 +++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 65 deletions(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index 1e11d0d3..426e76f5 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -18,7 +18,6 @@ _ = tk._ abort = tk.abort -c = tk.c log = logging.getLogger(__name__) DATASET_TYPE_NAME = 'showcase' @@ -29,8 +28,8 @@ def check_edit_view_auth(id): context = { 'model': model, 'session': model.Session, - 'user': c.user or c.author, - 'auth_user_obj': c.userobj, + 'user': tk.g.user or tk.g.author, + 'auth_user_obj': tk.g.userobj, 'save': 'save' in tk.request.params, 'pending': True } @@ -48,8 +47,8 @@ def check_new_view_auth(): context = { 'model': model, 'session': model.Session, - 'user': tk.c.user or tk.c.author, - 'auth_user_obj': tk.c.userobj, + 'user': tk.g.user or tk.g.author, + 'auth_user_obj': tk.g.userobj, 'save': 'save' in tk.request.params } @@ -68,24 +67,24 @@ def read_view(id): context = { 'model': model, 'session': model.Session, - 'user': c.user or c.author, + 'user': g.user or g.author, 'for_view': True, - 'auth_user_obj': c.userobj + 'auth_user_obj': tk.g.userobj } data_dict = {'id': id} # check if showcase exists try: - c.pkg_dict = tk.get_action('package_show')(context, data_dict) + tk.g.pkg_dict = tk.get_action('package_show')(context, data_dict) except tk.ObjectNotFound: return tk.abort(404, _('Showcase not found')) except tk.NotAuthorized: return tk.abort(401, _('Unauthorized to read showcase')) # get showcase packages - c.showcase_pkgs = tk.get_action('ckanext_showcase_package_list')( + tk.g.showcase_pkgs = tk.get_action('ckanext_showcase_package_list')( context, { - 'showcase_id': c.pkg_dict['id'] + 'showcase_id': tk.g.pkg_dict['id'] }) package_type = DATASET_TYPE_NAME @@ -98,7 +97,7 @@ def manage_datasets_view(id): context = { 'model': model, 'session': model.Session, - 'user': tk.c.user or tk.c.author + 'user': tk.g.user or tk.g.author } data_dict = {'id': id} @@ -112,7 +111,7 @@ def manage_datasets_view(id): # check if showcase exists try: - tk.c.pkg_dict = tk.get_action('package_show')(context, data_dict) + tk.g.pkg_dict = tk.get_action('package_show')(context, data_dict) except tk.ObjectNotFound: return tk.abort(404, _('Showcase not found')) except tk.NotAuthorized: @@ -139,7 +138,7 @@ def manage_datasets_view(id): for dataset_id in dataset_ids: tk.get_action('ckanext_showcase_package_association_delete')( context, { - 'showcase_id': tk.c.pkg_dict['id'], + 'showcase_id': tk.g.pkg_dict['id'], 'package_id': dataset_id }) h.flash_success( @@ -166,7 +165,7 @@ def manage_datasets_view(id): tk.get_action( 'ckanext_showcase_package_association_create')( context, { - 'showcase_id': tk.c.pkg_dict['id'], + 'showcase_id': tk.g.pkg_dict['id'], 'package_id': dataset_id }) except tk.ValidationError as e: @@ -182,12 +181,12 @@ def manage_datasets_view(id): url = h.url_for(manage_route, id=id) return h.redirect_to(url) - _add_dataset_search(tk.c.pkg_dict['id'], tk.c.pkg_dict['name']) + _add_dataset_search(tk.g.pkg_dict['id'], tk.g.pkg_dict['name']) # get showcase packages - tk.c.showcase_pkgs = tk.get_action('ckanext_showcase_package_list')( + tk.g.showcase_pkgs = tk.get_action('ckanext_showcase_package_list')( context, { - 'showcase_id': tk.c.pkg_dict['id'] + 'showcase_id': tk.g.pkg_dict['id'] }) return tk.render('showcase/manage_datasets.html') @@ -202,8 +201,8 @@ def _add_dataset_search(showcase_id, showcase_name): package_type = 'dataset' # unicode format (decoded from utf8) - q = c.q = tk.request.params.get('q', u'') - c.query_error = False + q = tk.g.q = tk.request.params.get('q', u'') + tk.g.query_error = False page = h.get_page_number(tk.request.params) limit = int(tk.config.get('ckan.datasets_per_page', 20)) @@ -220,7 +219,7 @@ def remove_field(key, value=None, replace=None): tk.check_ckan_version('2.9') else 'package', action='search') - c.remove_field = remove_field + tk.g.remove_field = remove_field sort_by = tk.request.params.get('sort', None) params_nosort = [(k, v) for k, v in params_nopage if k != 'sort'] @@ -242,45 +241,45 @@ def _sort_by(fields): params.append(('sort', sort_string)) return _search_url(params, showcase_name) - c.sort_by = _sort_by + tk.g.sort_by = _sort_by if sort_by is None: - c.sort_by_fields = [] + tk.g.sort_by_fields = [] else: - c.sort_by_fields = [field.split()[0] for field in sort_by.split(',')] + tk.g.sort_by_fields = [field.split()[0] for field in sort_by.split(',')] def pager_url(q=None, page=None): params = list(params_nopage) params.append(('page', page)) return _search_url(params, showcase_name) - c.search_url_params = urlencode(_encode_params(params_nopage)) + tk.g.search_url_params = urlencode(_encode_params(params_nopage)) try: - c.fields = [] - # c.fields_grouped will contain a dict of params containing + tk.g.fields = [] + # tk.g.fields_grouped will contain a dict of params containing # a list of values eg {'tags':['tag1', 'tag2']} - c.fields_grouped = {} + tk.g.fields_grouped = {} search_extras = {} fq = '' for (param, value) in tk.request.params.items(): if param not in ['q', 'page', 'sort'] \ and len(value) and not param.startswith('_'): if not param.startswith('ext_'): - c.fields.append((param, value)) + tk.g.fields.append((param, value)) fq += ' %s:"%s"' % (param, value) - if param not in c.fields_grouped: - c.fields_grouped[param] = [value] + if param not in tk.g.fields_grouped: + tk.g.fields_grouped[param] = [value] else: - c.fields_grouped[param].append(value) + tk.g.fields_grouped[param].append(value) else: search_extras[param] = value context = { 'model': model, 'session': model.Session, - 'user': c.user or c.author, + 'user': tk.g.user or tk.g.author, 'for_view': True, - 'auth_user_obj': c.userobj + 'auth_user_obj': tk.g.userobj } # Unless changed via config options, don't show other dataset @@ -341,7 +340,7 @@ def pager_url(q=None, page=None): for plugin in p.PluginImplementations(p.IFacets): facets = plugin.dataset_facets(facets, package_type) - c.facet_titles = facets + tk.g.facet_titles = facets data_dict = { 'q': q, @@ -354,24 +353,24 @@ def pager_url(q=None, page=None): } query = tk.get_action('package_search')(context, data_dict) - c.sort_by_selected = query['sort'] + tk.g.sort_by_selected = query['sort'] - c.page = h.Page(collection=query['results'], + tk.g.page = h.Page(collection=query['results'], page=page, url=pager_url, item_count=query['count'], items_per_page=limit) - c.facets = query['facets'] - c.search_facets = query['search_facets'] - c.page.items = query['results'] + tk.g.facets = query['facets'] + tk.g.search_facets = query['search_facets'] + tk.g.page.items = query['results'] except SearchError as se: log.error('Dataset search error: %r', se.args) - c.query_error = True - c.facets = {} - c.search_facets = {} - c.page = h.Page(collection=[]) - c.search_facets_limits = {} - for facet in c.search_facets.keys(): + tk.g.query_error = True + tk.g.facets = {} + tk.g.search_facets = {} + tk.g.page = h.Page(collection=[]) + tk.g.search_facets_limits = {} + for facet in tk.g.search_facets.keys(): try: limit = int( tk.request.params.get( @@ -382,7 +381,7 @@ def pager_url(q=None, page=None): 400, _("Parameter '{parameter_name}' is not an integer").format( parameter_name='_%s_limit' % facet)) - c.search_facets_limits[facet] = limit + tk.g.search_facets_limits[facet] = limit def _search_url(params, name): @@ -408,8 +407,8 @@ def delete_view(id): context = { 'model': model, 'session': model.Session, - 'user': c.user or c.author, - 'auth_user_obj': c.userobj + 'user': tk.g.user or tk.g.author, + 'auth_user_obj': tk.g.userobj } try: @@ -428,7 +427,7 @@ def delete_view(id): tk.get_action('ckanext_showcase_delete')(context, {'id': id}) h.flash_notice(_('Showcase has been deleted.')) return tk.redirect_to(index_route) - c.pkg_dict = tk.get_action('package_show')(context, {'id': id}) + tk.g.pkg_dict = tk.get_action('package_show')(context, {'id': id}) except tk.NotAuthorized: tk.abort(401, _('Unauthorized to delete showcase')) except tk.ObjectNotFound: @@ -442,9 +441,9 @@ def dataset_showcase_list(id): context = { 'model': model, 'session': model.Session, - 'user': c.user or c.author, + 'user': tk.g.user or tk.g.author, 'for_view': True, - 'auth_user_obj': c.userobj + 'auth_user_obj': tk.g.userobj } data_dict = {'id': id} @@ -456,10 +455,10 @@ def dataset_showcase_list(id): return tk.abort(401, _('Not authorized to see this page')) try: - c.pkg_dict = tk.get_action('package_show')(context, data_dict) - c.showcase_list = tk.get_action('ckanext_package_showcase_list')( + tk.g.pkg_dict = tk.get_action('package_show')(context, data_dict) + tk.g.showcase_list = tk.get_action('ckanext_package_showcase_list')( context, { - 'package_id': c.pkg_dict['id'] + 'package_id': tk.g.pkg_dict['id'] }) except tk.ObjectNotFound: return tk.abort(404, _('Dataset not found')) @@ -480,7 +479,7 @@ def dataset_showcase_list(id): if new_showcase: data_dict = { "showcase_id": new_showcase, - "package_id": c.pkg_dict['id'] + "package_id": tk.g.pkg_dict['id'] } try: tk.get_action('ckanext_showcase_package_association_create')( @@ -496,7 +495,7 @@ def dataset_showcase_list(id): if showcase_to_remove: data_dict = { "showcase_id": showcase_to_remove, - "package_id": c.pkg_dict['id'] + "package_id": tk.g.pkg_dict['id'] } try: tk.get_action('ckanext_showcase_package_association_delete')( @@ -507,24 +506,24 @@ def dataset_showcase_list(id): h.flash_success( _("The dataset has been removed from the showcase.")) return h.redirect_to( - h.url_for(list_route, id=c.pkg_dict['name'])) + h.url_for(list_route, id=tk.g.pkg_dict['name'])) - pkg_showcase_ids = [showcase['id'] for showcase in c.showcase_list] + pkg_showcase_ids = [showcase['id'] for showcase in tk.g.showcase_list] site_showcases = tk.get_action('ckanext_showcase_list')(context, {}) - c.showcase_dropdown = [[showcase['id'], showcase['title']] + tk.g.showcase_dropdown = [[showcase['id'], showcase['title']] for showcase in site_showcases if showcase['id'] not in pkg_showcase_ids] return tk.render("package/dataset_showcase_list.html", - extra_vars={'pkg_dict': c.pkg_dict}) + extra_vars={'pkg_dict': tk.g.pkg_dict}) def manage_showcase_admins(): context = { 'model': model, 'session': model.Session, - 'user': c.user or c.author + 'user': tk.g.user or tk.g.author } try: @@ -559,7 +558,7 @@ def manage_showcase_admins(): return tk.redirect_to(h.url_for(admins_route)) - c.showcase_admins = tk.get_action('ckanext_showcase_admin_list')({},{}) + tk.g.showcase_admins = tk.get_action('ckanext_showcase_admin_list')({},{}) return tk.render('admin/manage_showcase_admins.html') @@ -571,7 +570,7 @@ def remove_showcase_admin(): context = { 'model': model, 'session': model.Session, - 'user': c.user or c.author + 'user': tk.g.user or tk.g.author } try: @@ -606,8 +605,8 @@ def remove_showcase_admin(): return tk.redirect_to(h.url_for(admins_route)) - c.user_dict = tk.get_action('user_show')({}, {'id': user_id}) - c.user_id = user_id + tk.g.user_dict = tk.get_action('user_show')({}, {'id': user_id}) + tk.g.user_id = user_id return tk.render('admin/confirm_remove_showcase_admin.html') From e4b852f6507bf5833a86f7786292ab3cda43a66c Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 14:18:58 +0200 Subject: [PATCH 35/77] Fix lint --- ckanext/showcase/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index 426e76f5..f388bdee 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -67,7 +67,7 @@ def read_view(id): context = { 'model': model, 'session': model.Session, - 'user': g.user or g.author, + 'user': tk.g.user or tk.g.author, 'for_view': True, 'auth_user_obj': tk.g.userobj } From 09cc528f78801bf77c7b1090a862d86bbaa7bcdd Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 14:27:33 +0200 Subject: [PATCH 36/77] Drop support for 2.5 --- ckanext/showcase/logic/action/create.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/ckanext/showcase/logic/action/create.py b/ckanext/showcase/logic/action/create.py index f58dafec..0b4dbc68 100644 --- a/ckanext/showcase/logic/action/create.py +++ b/ckanext/showcase/logic/action/create.py @@ -24,13 +24,7 @@ def showcase_create(context, data_dict): # force type to 'showcase' data_dict['type'] = 'showcase' - # If get_uploader is available (introduced for IUploader in CKAN 2.5), use - # it, otherwise use the default uploader. - # https://github.com/ckan/ckan/pull/2510 - try: - upload = uploader.get_uploader('showcase') - except AttributeError: - upload = uploader.Upload('showcase') + upload = uploader.get_uploader('showcase') upload.update_data_dict(data_dict, 'image_url', 'image_upload', 'clear_upload') @@ -112,10 +106,7 @@ def showcase_upload(context, data_dict): ''' toolkit.check_access('ckanext_showcase_upload', context, data_dict) - try: - upload = uploader.get_uploader('showcase_image') - except AttributeError: - upload = uploader.Upload('showcase_image') + upload = uploader.get_uploader('showcase_image') upload.update_data_dict(data_dict, 'image_url', 'upload', 'clear_upload') upload.upload(uploader.get_max_image_size()) From 6651997bdd6077977e66d79b1886975807bda33f Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 14:30:46 +0200 Subject: [PATCH 37/77] Clean unused imports --- ckanext/showcase/logic/action/get.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ckanext/showcase/logic/action/get.py b/ckanext/showcase/logic/action/get.py index 837ffeba..aa6b7de0 100644 --- a/ckanext/showcase/logic/action/get.py +++ b/ckanext/showcase/logic/action/get.py @@ -1,9 +1,6 @@ -import sqlalchemy - import ckan.plugins.toolkit as toolkit import ckan.lib.dictization.model_dictize as model_dictize from ckan.lib.navl.dictization_functions import validate -from ckan.logic import NotAuthorized from ckanext.showcase.logic.schema import (showcase_package_list_schema, package_showcase_list_schema) @@ -12,9 +9,6 @@ import logging log = logging.getLogger(__name__) -_select = sqlalchemy.sql.select -_and_ = sqlalchemy.and_ - @toolkit.side_effect_free def showcase_show(context, data_dict): From f24ba955e0df04165db0c22257db1bc0d1f4abae Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 20 Apr 2022 14:37:53 +0200 Subject: [PATCH 38/77] Clean support for 2.5 --- ckanext/showcase/logic/action/update.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/ckanext/showcase/logic/action/update.py b/ckanext/showcase/logic/action/update.py index dc7e7caa..783d76ab 100644 --- a/ckanext/showcase/logic/action/update.py +++ b/ckanext/showcase/logic/action/update.py @@ -9,13 +9,7 @@ def showcase_update(context, data_dict): - # If get_uploader is available (introduced for IUploader in CKAN 2.5), use - # it, otherwise use the default uploader. - # https://github.com/ckan/ckan/pull/2510 - try: - upload = uploader.get_uploader('showcase', data_dict['image_url']) - except AttributeError: - upload = uploader.Upload('showcase', data_dict['image_url']) + upload = uploader.get_uploader('showcase', data_dict['image_url']) upload.update_data_dict(data_dict, 'image_url', 'image_upload', 'clear_upload') From 02cbc03e1458df68b7fabb6370b99a101ac29d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Mercader?= Date: Wed, 20 Apr 2022 15:13:14 +0200 Subject: [PATCH 39/77] Updated supported versions --- README.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.rst b/README.rst index db3f856b..6f004560 100644 --- a/README.rst +++ b/README.rst @@ -30,8 +30,7 @@ ckanext-showcase is intended to be a more powerful replacement for the Requirements ------------ - -Compatible with CKAN 2.9. +Tested on CKAN 2.7 to 2.10.. ------------ Installation From 17a5a3fad4d4a0d51e6f04caf757f13616683801 Mon Sep 17 00:00:00 2001 From: amercader Date: Wed, 20 Apr 2022 15:24:23 +0200 Subject: [PATCH 40/77] Bump version --- CHANGELOG.md | 6 ++++++ setup.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cc58cdf..b61b68c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Ckanext-showcase CHANGELOG + +## v1.5.0 2022-04-20 + +* Support for CKAN 2.10 (#143) +* Fix message in Add to showcase button (#139) + ## v1.4.8 2022-01-17 * Add Chinese (Traditional, Taiwan) translations (#136) diff --git a/setup.py b/setup.py index 8672b57a..36f5a1db 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ # Versions should comply with PEP440. For a discussion on single-sourcing # the version across setup.py and the project code, see # https://packaging.python.org/en/latest/distributing.html#version - version='1.4.8', + version='1.5.0', description='''A ckan extension to showcase datasets in use''', long_description=long_description, From c365dfeb30606161ed095ed30f502321b6a95ecd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Jul 2022 01:47:36 +0000 Subject: [PATCH 41/77] Bump terser from 4.6.13 to 4.8.1 Bumps [terser](https://github.com/terser/terser) from 4.6.13 to 4.8.1. - [Release notes](https://github.com/terser/terser/releases) - [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) - [Commits](https://github.com/terser/terser/commits) --- updated-dependencies: - dependency-name: terser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7f215e8..3465342c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9015,9 +9015,9 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "terser": { - "version": "4.6.13", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.13.tgz", - "integrity": "sha512-wMvqukYgVpQlymbnNbabVZbtM6PN63AzqexpwJL8tbh/mRT9LE5o+ruVduAGL7D6Fpjl+Q+06U5I9Ul82odAhw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", From b472647677abdcc6aae59afbde5d3b8275773d8f Mon Sep 17 00:00:00 2001 From: Rae Knowler Date: Wed, 10 Aug 2022 10:28:45 +0200 Subject: [PATCH 42/77] Bump version to 1.5.1 --- CHANGELOG.md | 3 +++ setup.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b61b68c3..d4d53b1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Ckanext-showcase CHANGELOG +## v1.5.1 2022-08-10 + +* Dependency update ## v1.5.0 2022-04-20 diff --git a/setup.py b/setup.py index 36f5a1db..d746f10a 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ # Versions should comply with PEP440. For a discussion on single-sourcing # the version across setup.py and the project code, see # https://packaging.python.org/en/latest/distributing.html#version - version='1.5.0', + version='1.5.1', description='''A ckan extension to showcase datasets in use''', long_description=long_description, From cea5b22e4015c1774a13a94aa2a791764cf74b76 Mon Sep 17 00:00:00 2001 From: sabinem Date: Tue, 4 Oct 2022 20:24:41 +0200 Subject: [PATCH 43/77] add blank line to readme file --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index 6f004560..9ee3d8be 100644 --- a/README.rst +++ b/README.rst @@ -257,3 +257,4 @@ See: "Internationalizing strings in extensions" : http://docs.ckan.org/en/latest 3. Compile your language catalog ( You can force pybabel compile to compile messages marked as fuzzy with the -f) python setup.py compile_catalog -f -l es + From 584276907a090ec843de3630f1947c87b2466c49 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 2 Nov 2022 10:25:28 +0100 Subject: [PATCH 44/77] Fix 2.9 compatibility --- ckanext/showcase/tests/test_plugin.py | 49 +++++++++++++++++++++++++-- ckanext/showcase/views.py | 7 +++- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/ckanext/showcase/tests/test_plugin.py b/ckanext/showcase/tests/test_plugin.py index 495ec5e7..366cbfe6 100644 --- a/ckanext/showcase/tests/test_plugin.py +++ b/ckanext/showcase/tests/test_plugin.py @@ -30,7 +30,7 @@ def test_showcase_listed_on_index(self, app): assert "my-showcase" in response.body -@pytest.mark.usefixtures("clean_db") +@pytest.mark.usefixtures("clean_db", "clean_index") class TestShowcaseNewView(object): def test_showcase_create_form_renders(self, app): @@ -65,8 +65,30 @@ def test_showcase_new_redirects_to_manage_datasets(self, app): == create_response.request.path ) + def test_create_showcase(self, app): + sysadmin = factories.Sysadmin() -@pytest.mark.usefixtures("clean_db") + env = {"REMOTE_USER": sysadmin["name"].encode("ascii")} + app.post( + url=url_for("showcase_new"), + extra_environ=env, + data={ + "name": "my-test-showcase", + "image_url": "", + "notes": "My new description!" + } + ) + + res = app.get( + url=url_for("showcase_read", id="my-test-showcase"), + extra_environ=env, + ) + assert "my-test-showcase" in res.body + assert "My new description!" in res.body + + + +@pytest.mark.usefixtures("clean_db", "clean_index") class TestShowcaseEditView(object): def test_showcase_edit_form_renders(self, app): """ @@ -106,8 +128,29 @@ def test_showcase_edit_redirects_to_showcase_details(self, app): == edit_response.request.path ) + def test_edit_showcase(self, app): + sysadmin = factories.Sysadmin() + factories.Dataset(name="my-showcase", type="showcase") + env = {"REMOTE_USER": sysadmin["name"]} -@pytest.mark.usefixtures("clean_db") + app.post( + url=url_for("showcase_edit", id="my-showcase"), + extra_environ=env, + data = { + "name": "my-edited-showcase", + "notes": "My new description!", + "image_url": "" + } + ) + res = app.get( + url=url_for("showcase_edit", id="my-edited-showcase"), + extra_environ=env, + ) + assert "my-edited-showcase" in res.body + assert "My new description!" in res.body + + +@pytest.mark.usefixtures("clean_db", "clean_index") class TestDatasetView(object): """Plugin adds a new showcases view for datasets.""" diff --git a/ckanext/showcase/views.py b/ckanext/showcase/views.py index f054085a..fd6fdd8b 100644 --- a/ckanext/showcase/views.py +++ b/ckanext/showcase/views.py @@ -70,7 +70,12 @@ def get(self, id, data=None, errors=None, error_summary=None): errors, error_summary) def post(self, id): - context = self._prepare() + if tk.check_ckan_version(min_version='2.10.0'): + context = self._prepare() + else: + # Remove when dropping support for 2.9 + context = self._prepare(id) + utils.check_edit_view_auth(id) data_dict = dataset.clean_dict( From 43c75fc0b605c65e4266e6704408b5257e82070a Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 2 Nov 2022 10:33:30 +0100 Subject: [PATCH 45/77] Skip tests in 2.8/2.7 --- ckanext/showcase/tests/test_plugin.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ckanext/showcase/tests/test_plugin.py b/ckanext/showcase/tests/test_plugin.py index 366cbfe6..2a91525a 100644 --- a/ckanext/showcase/tests/test_plugin.py +++ b/ckanext/showcase/tests/test_plugin.py @@ -66,6 +66,9 @@ def test_showcase_new_redirects_to_manage_datasets(self, app): ) def test_create_showcase(self, app): + if tk.check_ckan_version("2.8"): + pytest.skip("data argument not supported in post()") + sysadmin = factories.Sysadmin() env = {"REMOTE_USER": sysadmin["name"].encode("ascii")} @@ -129,6 +132,9 @@ def test_showcase_edit_redirects_to_showcase_details(self, app): ) def test_edit_showcase(self, app): + if tk.check_ckan_version("2.8"): + pytest.skip("data argument not supported in post()") + sysadmin = factories.Sysadmin() factories.Dataset(name="my-showcase", type="showcase") env = {"REMOTE_USER": sysadmin["name"]} @@ -136,7 +142,7 @@ def test_edit_showcase(self, app): app.post( url=url_for("showcase_edit", id="my-showcase"), extra_environ=env, - data = { + data={ "name": "my-edited-showcase", "notes": "My new description!", "image_url": "" From 3e6e6b91adec4e8e058e9c275eef74c4d8a2c972 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 2 Nov 2022 11:12:38 +0100 Subject: [PATCH 46/77] Add support for 2.10 in tests --- ckanext/showcase/tests/test_auth.py | 35 ++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/ckanext/showcase/tests/test_auth.py b/ckanext/showcase/tests/test_auth.py index bfa4cc83..e37f87b8 100644 --- a/ckanext/showcase/tests/test_auth.py +++ b/ckanext/showcase/tests/test_auth.py @@ -222,7 +222,11 @@ def test_auth_anon_user_cant_view_create_showcase(self, app): """ An anon (not logged in) user can't access the create showcase page. """ - _get_request(app, "/showcase/new", status=302) + if toolkit.check_ckan_version(min_version='2.10.0'): + _get_request(app, "/showcase/new", status=401) + else: + # Remove when dropping support for 2.9 + _get_request(app, "/showcase/new", status=302) def test_auth_logged_in_user_cant_view_create_showcase_page(self, app): """ @@ -305,10 +309,12 @@ def test_auth_anon_user_cant_view_edit_showcase_page(self, app): """ An anon (not logged in) user can't access the showcase edit page. """ - factories.Dataset(type="showcase", name="my-showcase") - - _get_request(app, "/showcase/edit/my-showcase", status=302) + if toolkit.check_ckan_version(min_version='2.10.0'): + _get_request(app, "/showcase/edit/my-showcase", status=401) + else: + # Remove when dropping support for 2.9 + _get_request(app, "/showcase/edit/my-showcase", status=302) def test_auth_logged_in_user_cant_view_edit_showcase_page(self, app): """ @@ -366,8 +372,11 @@ def test_auth_anon_user_cant_view_manage_datasets(self, app): """ factories.Dataset(type="showcase", name="my-showcase") - - _get_request(app, "/showcase/manage_datasets/my-showcase", status=302) + if toolkit.check_ckan_version(min_version='2.10.0'): + _get_request(app, "/showcase/manage_datasets/my-showcase", status=401) + else: + # Remove when dropping support for 2.9 + _get_request(app, "/showcase/manage_datasets/my-showcase", status=302) def test_auth_logged_in_user_cant_view_manage_datasets(self, app): """ @@ -425,8 +434,11 @@ def test_auth_anon_user_cant_view_delete_showcase_page(self, app): """ factories.Dataset(type="showcase", name="my-showcase") - - _get_request(app, "/showcase/delete/my-showcase", status=302) + if toolkit.check_ckan_version(min_version='2.10.0'): + _get_request(app, "/showcase/delete/my-showcase", status=401) + else: + # Remove when dropping support for 2.9 + _get_request(app, "/showcase/delete/my-showcase", status=302) def test_auth_logged_in_user_cant_view_delete_showcase_page(self, app): """ @@ -788,8 +800,11 @@ def test_auth_anon_user_cant_view_showcase_admin_manage_page(self, app): An anon (not logged in) user can't access the manage showcase admin page. """ - - _get_request(app, "/showcase/new", status=302) + if toolkit.check_ckan_version(min_version='2.10.0'): + _get_request(app, "/showcase/new", status=401) + else: + # Remove when dropping support for 2.9 + _get_request(app, "/showcase/new", status=302) def test_auth_logged_in_user_cant_view_showcase_admin_manage_page( self, app From a18087fd14445f7f092cad9dcd1000c74d3bf99f Mon Sep 17 00:00:00 2001 From: pdelboca Date: Wed, 2 Nov 2022 11:19:45 +0100 Subject: [PATCH 47/77] Fix CKAN check version --- ckanext/showcase/tests/test_plugin.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ckanext/showcase/tests/test_plugin.py b/ckanext/showcase/tests/test_plugin.py index 2a91525a..5b81557c 100644 --- a/ckanext/showcase/tests/test_plugin.py +++ b/ckanext/showcase/tests/test_plugin.py @@ -66,7 +66,8 @@ def test_showcase_new_redirects_to_manage_datasets(self, app): ) def test_create_showcase(self, app): - if tk.check_ckan_version("2.8"): + if not tk.check_ckan_version(min_version='2.9.0'): + # Remove when dropping support for 2.8 pytest.skip("data argument not supported in post()") sysadmin = factories.Sysadmin() @@ -132,7 +133,8 @@ def test_showcase_edit_redirects_to_showcase_details(self, app): ) def test_edit_showcase(self, app): - if tk.check_ckan_version("2.8"): + if not tk.check_ckan_version(min_version='2.9.0'): + # Remove when dropping support for 2.8 pytest.skip("data argument not supported in post()") sysadmin = factories.Sysadmin() From 51e35c58eb8e9f5efb11fbdafa32116f1cd894af Mon Sep 17 00:00:00 2001 From: Patricio Del Boca Date: Wed, 2 Nov 2022 11:39:24 +0100 Subject: [PATCH 48/77] Bump version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d746f10a..cd232d64 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ # Versions should comply with PEP440. For a discussion on single-sourcing # the version across setup.py and the project code, see # https://packaging.python.org/en/latest/distributing.html#version - version='1.5.1', + version='1.5.2', description='''A ckan extension to showcase datasets in use''', long_description=long_description, From 8d901c046ccc451e7c015f48a32d91d04e0bf7ef Mon Sep 17 00:00:00 2001 From: pdelboca Date: Tue, 14 Feb 2023 08:25:04 -0300 Subject: [PATCH 49/77] Refactor plugin class --- ckanext/showcase/{commands => }/cli.py | 2 +- ckanext/showcase/commands/__init__.py | 0 ckanext/showcase/commands/paster.py | 46 ------------------- .../{plugin/__init__.py => plugin.py} | 34 ++++++++------ ckanext/showcase/plugin/flask_plugin.py | 21 --------- ckanext/showcase/plugin/pylons_plugin.py | 42 ----------------- setup.py | 2 - 7 files changed, 22 insertions(+), 125 deletions(-) rename ckanext/showcase/{commands => }/cli.py (93%) delete mode 100644 ckanext/showcase/commands/__init__.py delete mode 100644 ckanext/showcase/commands/paster.py rename ckanext/showcase/{plugin/__init__.py => plugin.py} (93%) delete mode 100644 ckanext/showcase/plugin/flask_plugin.py delete mode 100644 ckanext/showcase/plugin/pylons_plugin.py diff --git a/ckanext/showcase/commands/cli.py b/ckanext/showcase/cli.py similarity index 93% rename from ckanext/showcase/commands/cli.py rename to ckanext/showcase/cli.py index 7d1d7385..55c56e36 100644 --- a/ckanext/showcase/commands/cli.py +++ b/ckanext/showcase/cli.py @@ -23,4 +23,4 @@ def markdown_to_html(): def get_commands(): - return [showcase] \ No newline at end of file + return [showcase] diff --git a/ckanext/showcase/commands/__init__.py b/ckanext/showcase/commands/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ckanext/showcase/commands/paster.py b/ckanext/showcase/commands/paster.py deleted file mode 100644 index d1c751c7..00000000 --- a/ckanext/showcase/commands/paster.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import print_function - -from ckan.lib.cli import CkanCommand - -from ckanext.showcase import utils - -# Paster commands for CKAN 2.8 and below - - -class MigrationCommand(CkanCommand): - ''' - ckanext-showcase migration command. - - Usage:: - - paster showcase markdown-to-html -c - - Migrate the notes of all showcases from markdown to html. - - Must be run from the ckanext-showcase directory. - ''' - summary = __doc__.split('\n')[0] - usage = __doc__ - - def __init__(self, name): - super(CkanCommand, self).__init__(name) - - def command(self): - ''' - Parse command line arguments and call appropriate method. - ''' - if not self.args or self.args[0] in ['--help', '-h', 'help']: - print(self.__doc__) - return - - cmd = self.args[0] - self._load_config() - - if cmd == 'markdown-to-html': - self.markdown_to_html() - else: - print('Command "{0}" not recognized'.format(cmd)) - - def markdown_to_html(self): - utils.markdown_to_html() diff --git a/ckanext/showcase/plugin/__init__.py b/ckanext/showcase/plugin.py similarity index 93% rename from ckanext/showcase/plugin/__init__.py rename to ckanext/showcase/plugin.py index ff36a0da..3dfd9c4f 100644 --- a/ckanext/showcase/plugin/__init__.py +++ b/ckanext/showcase/plugin.py @@ -14,17 +14,14 @@ import ckan.lib.helpers as h -import ckanext.showcase.utils as utils +from ckanext.showcase import cli +from ckanext.showcase import utils +from ckanext.showcase import views from ckanext.showcase.logic import auth, action +from ckanext.showcase.model import setup as model_setup import ckanext.showcase.logic.schema as showcase_schema import ckanext.showcase.logic.helpers as showcase_helpers -from ckanext.showcase.model import setup as model_setup - -if tk.check_ckan_version(u'2.9'): - from ckanext.showcase.plugin.flask_plugin import MixinPlugin -else: - from ckanext.showcase.plugin.pylons_plugin import MixinPlugin _ = tk._ @@ -33,8 +30,7 @@ DATASET_TYPE_NAME = utils.DATASET_TYPE_NAME -class ShowcasePlugin( - MixinPlugin, plugins.SingletonPlugin, lib_plugins.DefaultDatasetForm): +class ShowcasePlugin(plugins.SingletonPlugin, lib_plugins.DefaultDatasetForm): plugins.implements(plugins.IConfigurable) plugins.implements(plugins.IConfigurer) plugins.implements(plugins.IDatasetForm) @@ -44,13 +40,25 @@ class ShowcasePlugin( plugins.implements(plugins.IPackageController, inherit=True) plugins.implements(plugins.ITemplateHelpers) plugins.implements(plugins.ITranslation) + plugins.implements(plugins.IBlueprint) + plugins.implements(plugins.IClick) + + # IBlueprint + + def get_blueprint(self): + return views.get_blueprints() + + # IClick + + def get_commands(self): + return cli.get_commands() # IConfigurer def update_config(self, config): - tk.add_template_directory(config, '../templates') - tk.add_public_directory(config, '../public') - tk.add_resource('../fanstatic', 'showcase') + tk.add_template_directory(config, 'templates') + tk.add_public_directory(config, 'public') + tk.add_resource('fanstatic', 'showcase') if tk.check_ckan_version(min_version='2.7', max_version='2.9.0'): tk.add_ckan_admin_tab(config, 'showcase_admins', 'Showcase Config') @@ -201,7 +209,7 @@ def before_dataset_search(self, search_params): if filter not in fq: search_params.update({'fq': fq + " -" + filter}) return search_params - + # CKAN < 2.10 (Remove when dropping support for 2.9) def after_show(self, context, pkg_dict): ''' diff --git a/ckanext/showcase/plugin/flask_plugin.py b/ckanext/showcase/plugin/flask_plugin.py deleted file mode 100644 index 54cdef90..00000000 --- a/ckanext/showcase/plugin/flask_plugin.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- - -import ckan.plugins as p -import ckanext.showcase.views as views - -from ckanext.showcase.commands import cli - - -class MixinPlugin(p.SingletonPlugin): - p.implements(p.IBlueprint) - p.implements(p.IClick) - - # IBlueprint - - def get_blueprint(self): - return views.get_blueprints() - - # IClick - - def get_commands(self): - return cli.get_commands() diff --git a/ckanext/showcase/plugin/pylons_plugin.py b/ckanext/showcase/plugin/pylons_plugin.py deleted file mode 100644 index bda3916e..00000000 --- a/ckanext/showcase/plugin/pylons_plugin.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -from routes.mapper import SubMapper -import ckan.plugins as p - - -class MixinPlugin(p.SingletonPlugin): - p.implements(p.IRoutes, inherit=True) - - # IRoutes - - def before_map(self, map): - # These named routes are used for custom dataset forms which will use - # the names below based on the dataset.type ('dataset' is the default - # type) - with SubMapper( - map, controller='ckanext.showcase.controller:ShowcaseController' - ) as m: - m.connect('showcase_index', '/showcase', action='search', - highlight_actions='index search') - m.connect('showcase_new', '/showcase/new', action='new') - m.connect('showcase_delete', '/showcase/delete/{id}', - action='delete') - m.connect('showcase_read', '/showcase/{id}', action='read', - ckan_icon='picture') - m.connect('showcase_edit', '/showcase/edit/{id}', - action='edit', ckan_icon='edit') - m.connect('showcase_manage_datasets', - '/showcase/manage_datasets/{id}', - action="manage_datasets", ckan_icon="sitemap") - m.connect('showcase_dataset_showcase_list', '/dataset/showcases/{id}', - action='dataset_showcase_list', ckan_icon='picture') - m.connect('showcase_admins', '/ckan-admin/showcase_admins', - action='manage_showcase_admins', ckan_icon='picture'), - m.connect('showcase_admin_remove', - '/ckan-admin/showcase_admin_remove', - action='remove_showcase_admin'), - m.connect('showcase_upload', '/showcase_upload', - action='showcase_upload') - map.redirect('/showcases', '/showcase') - map.redirect('/showcases/{url:.*}', '/showcase/{url}') - return map diff --git a/setup.py b/setup.py index cd232d64..44e339f0 100644 --- a/setup.py +++ b/setup.py @@ -82,8 +82,6 @@ [babel.extractors] ckan = ckan.lib.extract:extract_ckan - [paste.paster_command] - showcase=ckanext.showcase.commands.paster:MigrationCommand ''', message_extractors={ From 4d96646a59cc9858f763de271cca3d8e10a20c53 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Tue, 14 Feb 2023 08:42:30 -0300 Subject: [PATCH 50/77] Sanitize blueprint endpoints. --- ckanext/showcase/plugin.py | 24 +----------------------- ckanext/showcase/tests/test_plugin.py | 10 +++++----- ckanext/showcase/views.py | 24 +++++++++++++++--------- 3 files changed, 21 insertions(+), 37 deletions(-) diff --git a/ckanext/showcase/plugin.py b/ckanext/showcase/plugin.py index 3dfd9c4f..3dd907fc 100644 --- a/ckanext/showcase/plugin.py +++ b/ckanext/showcase/plugin.py @@ -59,29 +59,7 @@ def update_config(self, config): tk.add_template_directory(config, 'templates') tk.add_public_directory(config, 'public') tk.add_resource('fanstatic', 'showcase') - if tk.check_ckan_version(min_version='2.7', max_version='2.9.0'): - tk.add_ckan_admin_tab(config, 'showcase_admins', - 'Showcase Config') - elif tk.check_ckan_version(min_version='2.9.0'): - tk.add_ckan_admin_tab(config, 'showcase_blueprint.admins', - 'Showcase Config') - - if tk.check_ckan_version(min_version='2.9.0'): - mappings = config.get('ckan.legacy_route_mappings', {}) - if isinstance(mappings, string_types): - mappings = json.loads(mappings) - - bp_routes = [ - 'index', 'new', 'delete', - 'read', 'edit', 'manage_datasets', - 'dataset_showcase_list', 'admins', 'admin_remove' - ] - mappings.update({ - 'showcase_' + route: 'showcase_blueprint.' + route - for route in bp_routes - }) - # https://github.com/ckan/ckan/pull/4521 - config['ckan.legacy_route_mappings'] = json.dumps(mappings) + tk.add_ckan_admin_tab(config, 'showcase_blueprint.admins', 'Showcase Config') # IConfigurable diff --git a/ckanext/showcase/tests/test_plugin.py b/ckanext/showcase/tests/test_plugin.py index 5b81557c..9bddd790 100644 --- a/ckanext/showcase/tests/test_plugin.py +++ b/ckanext/showcase/tests/test_plugin.py @@ -188,7 +188,7 @@ def test_dataset_showcase_page_lists_showcases_no_associations(self, app): dataset = factories.Dataset(name="my-dataset") response = app.get( - url=url_for("showcase_dataset_showcase_list", id=dataset["id"]) + url=url_for("showcase_blueprint.dataset_showcase_list", id=dataset["id"]) ) assert ( @@ -230,7 +230,7 @@ def test_dataset_showcase_page_lists_showcases_two_associations(self, app): ) response = app.get( - url=url_for("showcase_dataset_showcase_list", id=dataset["id"]) + url=url_for("showcase_blueprint.dataset_showcase_list", id=dataset["id"]) ) assert len(BeautifulSoup(response.body).select("li.media-item")) == 2 @@ -390,7 +390,7 @@ def test_showcase_admin_manage_page_returns_correct_status(self, app): sysadmin = factories.Sysadmin() env = {"REMOTE_USER": sysadmin["name"].encode("ascii")} - app.get(url=url_for("showcase_admins"), status=200, extra_environ=env) + app.get(url=url_for("showcase_blueprint.admins"), status=200, extra_environ=env) def test_showcase_admin_manage_page_lists_showcase_admins(self, app): """ @@ -412,7 +412,7 @@ def test_showcase_admin_manage_page_lists_showcase_admins(self, app): env = {"REMOTE_USER": sysadmin["name"].encode("ascii")} response = app.get( - url=url_for("showcase_admins"), status=200, extra_environ=env + url=url_for("showcase_blueprint.admins"), status=200, extra_environ=env ) assert "/user/{0}".format(user_one["name"]) in response @@ -428,7 +428,7 @@ def test_showcase_admin_manage_page_no_admins_message(self, app): env = {"REMOTE_USER": sysadmin["name"].encode("ascii")} response = app.get( - url=url_for("showcase_admins"), status=200, extra_environ=env + url=url_for("showcase_blueprint.admins"), status=200, extra_environ=env ) assert "There are currently no Showcase Admins" in response diff --git a/ckanext/showcase/views.py b/ckanext/showcase/views.py index fd6fdd8b..5d8c5786 100644 --- a/ckanext/showcase/views.py +++ b/ckanext/showcase/views.py @@ -118,27 +118,33 @@ def upload(): return utils.upload() -showcase.add_url_rule('/showcase', view_func=index) -showcase.add_url_rule('/showcase/new', view_func=CreateView.as_view('new')) +showcase.add_url_rule('/showcase', view_func=index, endpoint="index") +showcase.add_url_rule('/showcase/new', view_func=CreateView.as_view('new'), endpoint="new") showcase.add_url_rule('/showcase/delete/', view_func=delete, - methods=[u'GET', u'POST']) -showcase.add_url_rule('/showcase/', view_func=read) + methods=[u'GET', u'POST'], + endpoint="delete") +showcase.add_url_rule('/showcase/', view_func=read, endpoint="read") showcase.add_url_rule('/showcase/edit/', view_func=EditView.as_view('edit'), - methods=[u'GET', u'POST']) + methods=[u'GET', u'POST'], + endpoint="edit") showcase.add_url_rule('/showcase/manage_datasets/', view_func=manage_datasets, - methods=[u'GET', u'POST']) + methods=[u'GET', u'POST'], + endpoint="manage_datasets") showcase.add_url_rule('/dataset/showcases/', view_func=dataset_showcase_list, - methods=[u'GET', u'POST']) + methods=[u'GET', u'POST'], + endpoint="dataset_showcase_list") showcase.add_url_rule('/ckan-admin/showcase_admins', view_func=admins, - methods=[u'GET', u'POST']) + methods=[u'GET', u'POST'], + endpoint="admins") showcase.add_url_rule('/ckan-admin/showcase_admin_remove', view_func=admin_remove, - methods=[u'GET', u'POST']) + methods=[u'GET', u'POST'], + endpoint='admin_remove') showcase.add_url_rule('/showcase_upload', view_func=upload, methods=[u'POST']) From 3708a99dba21429bec2150bca2f02bd3ba59962e Mon Sep 17 00:00:00 2001 From: pdelboca Date: Tue, 14 Feb 2023 08:54:48 -0300 Subject: [PATCH 51/77] Drop code checking for older versions --- ckanext/showcase/logic/auth.py | 1 + ckanext/showcase/logic/helpers.py | 5 +-- ckanext/showcase/plugin.py | 3 -- ckanext/showcase/utils.py | 66 ++++++++++--------------------- 4 files changed, 22 insertions(+), 53 deletions(-) diff --git a/ckanext/showcase/logic/auth.py b/ckanext/showcase/logic/auth.py index 4cf43307..86e58cf2 100644 --- a/ckanext/showcase/logic/auth.py +++ b/ckanext/showcase/logic/auth.py @@ -114,6 +114,7 @@ def showcase_admin_list(context, data_dict): '''Only sysadmins can list showcase admin users.''' return {'success': False} + def showcase_upload(context, data_dict): '''Only sysadmins can upload images.''' return {'success': _is_showcase_admin(context)} diff --git a/ckanext/showcase/logic/helpers.py b/ckanext/showcase/logic/helpers.py index 88ff9fc7..4c2bfa96 100644 --- a/ckanext/showcase/logic/helpers.py +++ b/ckanext/showcase/logic/helpers.py @@ -7,10 +7,7 @@ def facet_remove_field(key, value=None, replace=None): A custom remove field function to be used by the Showcase search page to render the remove link for the tag pills. ''' - if tk.check_ckan_version(min_version='2.9.0'): - index_route = 'showcase_blueprint.index' - else: - index_route = 'showcase_index' + index_route = 'showcase_blueprint.index' return h.remove_url_param( key, value=value, replace=replace, diff --git a/ckanext/showcase/plugin.py b/ckanext/showcase/plugin.py index 3dd907fc..83ef7bb3 100644 --- a/ckanext/showcase/plugin.py +++ b/ckanext/showcase/plugin.py @@ -2,12 +2,9 @@ import os import sys -import json import logging from collections import OrderedDict -from six import string_types - import ckan.plugins as plugins import ckan.plugins.toolkit as tk import ckan.lib.plugins as lib_plugins diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index f388bdee..ec269da1 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -21,7 +21,6 @@ log = logging.getLogger(__name__) DATASET_TYPE_NAME = 'showcase' -ckan_29_or_higher = tk.check_ckan_version(min_version='2.9.0') def check_edit_view_auth(id): @@ -117,15 +116,10 @@ def manage_datasets_view(id): except tk.NotAuthorized: return tk.abort(401, _('Unauthorized to read showcase')) - # Are we removing a showcase/dataset association? - form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.params - - if tk.check_ckan_version(min_version='2.9.0'): - manage_route = 'showcase_blueprint.manage_datasets' - else: - manage_route = 'showcase_manage_datasets' + form_data = tk.request.form + manage_route = 'showcase_blueprint.manage_datasets' + # Are we removing a showcase/dataset association? if (tk.request.method == 'POST' and 'bulk_action.showcase_remove' in form_data): # Find the datasets to perform the action on, they are prefixed by @@ -191,6 +185,7 @@ def manage_datasets_view(id): return tk.render('showcase/manage_datasets.html') + def _add_dataset_search(showcase_id, showcase_name): ''' Search logic for discovering datasets to add to a showcase. @@ -399,10 +394,8 @@ def url_with_params(url, params): def delete_view(id): - if 'cancel' in tk.request.params: - tk.redirect_to( - 'showcase_blueprint.edit' if tk.check_ckan_version(min_version='2.9.0') - else 'showcase_edit', id=id) + if 'cancel' in tk.request.args: + tk.redirect_to('showcase_blueprint.edit', id=id) context = { 'model': model, @@ -416,10 +409,7 @@ def delete_view(id): except tk.NotAuthorized: return tk.abort(401, _('Unauthorized to delete showcase')) - if tk.check_ckan_version(min_version='2.9.0'): - index_route = 'showcase_blueprint.index' - else: - index_route = 'showcase_index' + index_route = 'showcase_blueprint.index' context = {'user': tk.g.user} try: @@ -432,7 +422,7 @@ def delete_view(id): tk.abort(401, _('Unauthorized to delete showcase')) except tk.ObjectNotFound: tk.abort(404, _('Showcase not found')) - + return tk.render('showcase/confirm_delete.html', extra_vars={'dataset_type': DATASET_TYPE_NAME}) @@ -465,15 +455,11 @@ def dataset_showcase_list(id): except tk.NotAuthorized: return tk.abort(401, _('Unauthorized to read package')) - if tk.check_ckan_version(min_version='2.9.0'): - list_route = 'showcase_blueprint.dataset_showcase_list' - else: - list_route = 'showcase_dataset_showcase_list' + list_route = 'showcase_blueprint.dataset_showcase_list' if tk.request.method == 'POST': # Are we adding the dataset to a showcase? - form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.params + form_data = tk.request.form new_showcase = form_data.get('showcase_added') if new_showcase: @@ -531,13 +517,8 @@ def manage_showcase_admins(): except tk.NotAuthorized: return tk.abort(401, _('User not authorized to view page')) - form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.params - - if tk.check_ckan_version(min_version='2.9.0'): - admins_route = 'showcase_blueprint.admins' - else: - admins_route = 'showcase_admins' + form_data = tk.request.form + admins_route = 'showcase_blueprint.admins' # We're trying to add a user to the showcase admins list. if tk.request.method == 'POST' and form_data['username']: @@ -578,13 +559,8 @@ def remove_showcase_admin(): except tk.NotAuthorized: return tk.abort(401, _('User not authorized to view page')) - form_data = tk.request.form if tk.check_ckan_version( - '2.9') else tk.request.params - - if tk.check_ckan_version(min_version='2.9.0'): - admins_route = 'showcase_blueprint.admins' - else: - admins_route = 'showcase_admins' + form_data = tk.request.form + admins_route = 'showcase_blueprint.admins' if 'cancel' in form_data: return tk.redirect_to(admins_route) @@ -646,16 +622,14 @@ def upload(): if not tk.request.method == 'POST': tk.abort(409, _('Only Posting is availiable')) - if ckan_29_or_higher: - data_dict = logic.clean_dict( - dict_fns.unflatten( - logic.tuplize_dict( - logic.parse_params(tk.request.files) - ) + data_dict = logic.clean_dict( + dict_fns.unflatten( + logic.tuplize_dict( + logic.parse_params(tk.request.files) ) ) - else: - data_dict = tk.request.POST + ) + try: url = tk.get_action('ckanext_showcase_upload')( From da8e0ee428bab1e1b19906fece2cbc4d97273cb7 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Tue, 14 Feb 2023 08:54:58 -0300 Subject: [PATCH 52/77] Remove old controller class --- ckanext/showcase/controller.py | 130 --------------------------------- 1 file changed, 130 deletions(-) delete mode 100644 ckanext/showcase/controller.py diff --git a/ckanext/showcase/controller.py b/ckanext/showcase/controller.py deleted file mode 100644 index 04151918..00000000 --- a/ckanext/showcase/controller.py +++ /dev/null @@ -1,130 +0,0 @@ -import logging -import json - - -from ckan.plugins import toolkit as tk -import ckan.lib.helpers as h -import ckan.lib.navl.dictization_functions as dict_fns -import ckan.logic as logic -from ckan.controllers.package import (PackageController) - - -from ckanext.showcase import utils -from ckanext.showcase.utils import DATASET_TYPE_NAME - -_ = tk._ -c = tk.c -request = tk.request -render = tk.render -abort = tk.abort -redirect = tk.redirect_to -NotFound = tk.ObjectNotFound -ValidationError = tk.ValidationError -check_access = tk.check_access -get_action = tk.get_action -tuplize_dict = logic.tuplize_dict -clean_dict = logic.clean_dict -parse_params = logic.parse_params -NotAuthorized = tk.NotAuthorized - -log = logging.getLogger(__name__) - - -class ShowcaseController(PackageController): - def new(self, data=None, errors=None, error_summary=None): - - utils.check_new_view_auth() - return super(ShowcaseController, self).new(data=data, - errors=errors, - error_summary=error_summary) - - def edit(self, id, data=None, errors=None, error_summary=None): - utils.check_edit_view_auth(id) - return super(ShowcaseController, - self).edit(id, - data=data, - errors=errors, - error_summary=error_summary) - - def _guess_package_type(self, expecting_name=False): - """Showcase packages are always DATASET_TYPE_NAME.""" - - return DATASET_TYPE_NAME - - def _save_new(self, context, package_type=None): - ''' - The showcase is created then redirects to the manage_dataset page to - associated packages with the new showcase. - ''' - - data_dict = clean_dict( - dict_fns.unflatten(tuplize_dict(parse_params(request.POST)))) - - data_dict['type'] = package_type - - try: - pkg_dict = get_action('ckanext_showcase_create')(context, - data_dict) - except ValidationError as e: - errors = e.error_dict - error_summary = e.error_summary - data_dict['state'] = 'none' - return self.new(data_dict, errors, error_summary) - - # redirect to manage datasets - url = h.url_for('showcase_manage_datasets', id=pkg_dict['name']) - redirect(url) - - def _save_edit(self, name_or_id, context, package_type=None): - ''' - Edit a showcase's details, then redirect to the showcase read page. - ''' - - data_dict = clean_dict( - dict_fns.unflatten(tuplize_dict(parse_params(request.POST)))) - - data_dict['id'] = name_or_id - try: - pkg = get_action('ckanext_showcase_update')(context, data_dict) - except ValidationError as e: - errors = e.error_dict - error_summary = e.error_summary - return self.edit(name_or_id, data_dict, errors, error_summary) - - c.pkg_dict = pkg - - # redirect to showcase details page - url = h.url_for('showcase_read', id=pkg['name']) - redirect(url) - - def read(self, id, format='html'): - ''' - Detail view for a single showcase, listing its associated datasets. - ''' - - return utils.read_view(id) - - def delete(self, id): - return utils.delete_view(id) - - def dataset_showcase_list(self, id): - ''' - Display a list of showcases a dataset is associated with, with an - option to add to showcase from a list. - ''' - return utils.dataset_showcase_list(id) - - def manage_datasets(self, id): - ''' - List datasets associated with the given showcase id. - ''' - return utils.manage_datasets_view(id) - - def manage_showcase_admins(self): - return utils.manage_showcase_admins() - - def remove_showcase_admin(self): - return utils.remove_showcase_admin() - - def showcase_upload(self): - return utils.upload() From 48185b2dd114799830fa5bc5b81ab4af21275886 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Tue, 14 Feb 2023 08:56:16 -0300 Subject: [PATCH 53/77] Do not run tests in not supported versions --- .github/workflows/test.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 968a168e..9b11b07c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,10 +4,10 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 with: - python-version: '3.6' + python-version: '3.10' - name: Install requirements run: pip install flake8 pycodestyle - name: Check syntax @@ -17,7 +17,7 @@ jobs: needs: lint strategy: matrix: - ckan-version: ["2.10", 2.9, 2.9-py2, 2.8, 2.7] + ckan-version: ["2.10", 2.9] fail-fast: false name: CKAN ${{ matrix.ckan-version }} @@ -44,7 +44,7 @@ jobs: CKAN_REDIS_URL: redis://redis:6379/1 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install requirements run: | pip install -r requirements.txt @@ -53,16 +53,10 @@ jobs: # Replace default path to CKAN core config file with the one on the container sed -i -e 's/use = config:.*/use = config:\/srv\/app\/src\/ckan\/test-core.ini/' test.ini - name: Setup extension (CKAN >= 2.9) - if: ${{ matrix.ckan-version != '2.7' && matrix.ckan-version != '2.8' }} run: | ckan -c test.ini db init - - name: Setup extension (CKAN < 2.9) - if: ${{ matrix.ckan-version == '2.7' || matrix.ckan-version == '2.8' }} - run: | - paster --plugin=ckan db init -c test.ini - name: Run tests run: pytest --ckan-ini=test.ini --cov=ckanext.showcase --cov-report=xml --cov-append --disable-warnings ckanext/showcase/tests - - name: Upload coverage report to codecov uses: codecov/codecov-action@v1 with: From 20f9ab193525ffbc4eed70ed4d3b360a11b23698 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Tue, 14 Feb 2023 09:06:01 -0300 Subject: [PATCH 54/77] Drop pylons route support in templates --- .../admin/confirm_remove_showcase_admin.html | 3 +-- .../templates/admin/manage_showcase_admins.html | 3 +-- ckanext/showcase/templates/header.html | 12 +++++------- ckanext/showcase/templates/home/snippets/stats.html | 9 ++++----- ckanext/showcase/templates/package/read_base.html | 3 +-- .../showcase/templates/showcase/confirm_delete.html | 4 +--- ckanext/showcase/templates/showcase/edit_base.html | 10 +++++----- .../templates/showcase/new_package_form.html | 7 +++---- ckanext/showcase/templates/showcase/read.html | 7 +++---- ckanext/showcase/templates/showcase/search.html | 6 +++--- .../showcase/templates/showcase/snippets/helper.html | 3 +-- .../templates/showcase/snippets/showcase_item.html | 4 +--- .../showcase/templates/showcase/snippets/tags.html | 3 +-- 13 files changed, 30 insertions(+), 44 deletions(-) diff --git a/ckanext/showcase/templates/admin/confirm_remove_showcase_admin.html b/ckanext/showcase/templates/admin/confirm_remove_showcase_admin.html index b890becb..342012b9 100644 --- a/ckanext/showcase/templates/admin/confirm_remove_showcase_admin.html +++ b/ckanext/showcase/templates/admin/confirm_remove_showcase_admin.html @@ -1,6 +1,5 @@ {% extends "page.html" %} -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_admin_remove_route = 'showcase_blueprint.admin_remove' if ckan_29_or_higher else 'showcase_admin_remove' %} +{% set showcase_admin_remove_route = 'showcase_blueprint.admin_remove' %} {% block subtitle %}{{ _("Confirm Remove") }}{% endblock %} diff --git a/ckanext/showcase/templates/admin/manage_showcase_admins.html b/ckanext/showcase/templates/admin/manage_showcase_admins.html index 9961df1d..e129f4a5 100644 --- a/ckanext/showcase/templates/admin/manage_showcase_admins.html +++ b/ckanext/showcase/templates/admin/manage_showcase_admins.html @@ -3,8 +3,7 @@ {% import 'macros/form.html' as form %} {% set user = c.user_dict %} -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_admin_remove_route = 'showcase_blueprint.admin_remove' if ckan_29_or_higher else 'showcase_admin_remove' %} +{% set showcase_admin_remove_route = 'showcase_blueprint.admin_remove' %} {% block primary_content_inner %} diff --git a/ckanext/showcase/templates/header.html b/ckanext/showcase/templates/header.html index 1bc498cc..51e2afd8 100644 --- a/ckanext/showcase/templates/header.html +++ b/ckanext/showcase/templates/header.html @@ -1,12 +1,10 @@ {% ckan_extends %} -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} - -{% set search_route = 'dataset.search' if ckan_29_or_higher else 'search' %} -{% set org_route = 'organization.index' if ckan_29_or_higher else 'organizations_index' %} -{% set group_route = 'group.index' if ckan_29_or_higher else 'group_index' %} -{% set showcase_route = 'showcase_blueprint.index' if ckan_29_or_higher else 'showcase_index' %} -{% set about_route = 'home.about' if ckan_29_or_higher else 'about' %} +{% set search_route = 'dataset.search' %} +{% set org_route = 'organization.index' %} +{% set group_route = 'group.index' %} +{% set showcase_route = 'showcase_blueprint.index' %} +{% set about_route = 'home.about' %} {% block header_site_navigation_tabs %} diff --git a/ckanext/showcase/templates/home/snippets/stats.html b/ckanext/showcase/templates/home/snippets/stats.html index a122f7aa..978f063b 100644 --- a/ckanext/showcase/templates/home/snippets/stats.html +++ b/ckanext/showcase/templates/home/snippets/stats.html @@ -1,8 +1,7 @@ -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_index_route = 'showcase_blueprint.index' if ckan_29_or_higher else 'showcase_index' %} -{% set search_route = 'dataset.search' if ckan_29_or_higher else 'package_search' %} -{% set organization_route = 'organization.index' if ckan_29_or_higher else 'organization_index' %} -{% set group_route = 'group.index' if ckan_29_or_higher else 'group_index' %} +{% set showcase_index_route = 'showcase_blueprint.index' %} +{% set search_route = 'dataset.search' %} +{% set organization_route = 'organization.index' %} +{% set group_route = 'group.index' %} {% set stats = h.get_site_statistics() %} diff --git a/ckanext/showcase/templates/package/read_base.html b/ckanext/showcase/templates/package/read_base.html index 31682fe7..e41d3263 100644 --- a/ckanext/showcase/templates/package/read_base.html +++ b/ckanext/showcase/templates/package/read_base.html @@ -1,6 +1,5 @@ {% ckan_extends %} -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_dataset_showcase_list_route = 'showcase_blueprint.dataset_showcase_list' if ckan_29_or_higher else 'showcase_dataset_showcase_list' %} +{% set showcase_dataset_showcase_list_route = 'showcase_blueprint.dataset_showcase_list' %} {% block content_primary_nav %} {{ super() }} diff --git a/ckanext/showcase/templates/showcase/confirm_delete.html b/ckanext/showcase/templates/showcase/confirm_delete.html index 5cf9b082..ad88eab2 100644 --- a/ckanext/showcase/templates/showcase/confirm_delete.html +++ b/ckanext/showcase/templates/showcase/confirm_delete.html @@ -1,9 +1,7 @@ {% extends "page.html" %} {% set pkg = pkg_dict or c.pkg_dict %} - -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_delete_route = 'showcase_blueprint.delete' if ckan_29_or_higher else 'showcase_delete' %} +{% set showcase_delete_route = 'showcase_blueprint.delete' %} {% block subtitle %}{{ _("Confirm Delete") }}{% endblock %} diff --git a/ckanext/showcase/templates/showcase/edit_base.html b/ckanext/showcase/templates/showcase/edit_base.html index cc0da4aa..e690d51e 100644 --- a/ckanext/showcase/templates/showcase/edit_base.html +++ b/ckanext/showcase/templates/showcase/edit_base.html @@ -1,11 +1,11 @@ {% extends 'page.html' %} {% set pkg = pkg_dict or c.pkg_dict %} -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_index_route = 'showcase_blueprint.index' if ckan_29_or_higher else 'showcase_index' %} -{% set showcase_read_route = 'showcase_blueprint.read' if ckan_29_or_higher else 'showcase_read' %} -{% set showcase_edit_route = 'showcase_blueprint.edit' if ckan_29_or_higher else 'showcase_edit' %} -{% set showcase_manage_route = 'showcase_blueprint.manage_datasets' if ckan_29_or_higher else 'showcase_manage_datasets' %} + +{% set showcase_index_route = 'showcase_blueprint.index' %} +{% set showcase_read_route = 'showcase_blueprint.read' %} +{% set showcase_edit_route = 'showcase_blueprint.edit' %} +{% set showcase_manage_route = 'showcase_blueprint.manage_datasets' %} diff --git a/ckanext/showcase/templates/showcase/new_package_form.html b/ckanext/showcase/templates/showcase/new_package_form.html index 626adafc..e5e1a447 100644 --- a/ckanext/showcase/templates/showcase/new_package_form.html +++ b/ckanext/showcase/templates/showcase/new_package_form.html @@ -1,13 +1,12 @@ {% import 'macros/form.html' as form %} {% set action = c.form_action or '' %} {% set form_style = c.form_style or c.action %} -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_read_route = 'showcase_blueprint.read' if ckan_29_or_higher else 'showcase_read' %} -{% set showcase_delete_route = 'showcase_blueprint.delete' if ckan_29_or_higher else 'showcase_delete' %} +{% set showcase_read_route = 'showcase_blueprint.read' %} +{% set showcase_delete_route = 'showcase_blueprint.delete' %}
    - + {{ h.csrf_input() if 'csrf_input' in h }} {# pkg_name used in 3 stage edit #} diff --git a/ckanext/showcase/templates/showcase/read.html b/ckanext/showcase/templates/showcase/read.html index 62fbf8ac..fb951514 100644 --- a/ckanext/showcase/templates/showcase/read.html +++ b/ckanext/showcase/templates/showcase/read.html @@ -4,10 +4,9 @@ {% set name = pkg.title or pkg.name %} {% set editor = h.get_wysiwyg_editor() %} -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_read_route = 'showcase_blueprint.read' if ckan_29_or_higher else 'showcase_read' %} -{% set showcase_index_route = 'showcase_blueprint.index' if ckan_29_or_higher else 'showcase_index' %} -{% set showcase_edit_route = 'showcase_blueprint.edit' if ckan_29_or_higher else 'showcase_edit' %} +{% set showcase_read_route = 'showcase_blueprint.read' %} +{% set showcase_index_route = 'showcase_blueprint.index' %} +{% set showcase_edit_route = 'showcase_blueprint.edit' %} {% block subtitle %}{{ pkg.title or pkg.name }} - {{ _('Showcases') }}{% endblock %} diff --git a/ckanext/showcase/templates/showcase/search.html b/ckanext/showcase/templates/showcase/search.html index b975a013..4296519c 100644 --- a/ckanext/showcase/templates/showcase/search.html +++ b/ckanext/showcase/templates/showcase/search.html @@ -1,8 +1,8 @@ {% extends "package/search.html" %} {% import 'macros/form.html' as form %} -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_index_route = 'showcase_blueprint.index' if ckan_29_or_higher else 'showcase_index' %} -{% set showcase_new_route = 'showcase_blueprint.new' if ckan_29_or_higher else 'showcase_new' %} + +{% set showcase_index_route = 'showcase_blueprint.index' %} +{% set showcase_new_route = 'showcase_blueprint.new' %} {% block subtitle %}{{ _("Showcases") }}{% endblock %} diff --git a/ckanext/showcase/templates/showcase/snippets/helper.html b/ckanext/showcase/templates/showcase/snippets/helper.html index eb61c16e..de0cf06b 100644 --- a/ckanext/showcase/templates/showcase/snippets/helper.html +++ b/ckanext/showcase/templates/showcase/snippets/helper.html @@ -1,5 +1,4 @@ -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} -{% set showcase_admins_route = 'showcase_blueprint.admins' if ckan_29_or_higher else 'showcase_admins' %} +{% set showcase_admins_route = 'showcase_blueprint.admins' %}

    diff --git a/ckanext/showcase/templates/showcase/snippets/showcase_item.html b/ckanext/showcase/templates/showcase/snippets/showcase_item.html index ca8c199e..36362830 100644 --- a/ckanext/showcase/templates/showcase/snippets/showcase_item.html +++ b/ckanext/showcase/templates/showcase/snippets/showcase_item.html @@ -13,9 +13,7 @@ {% set title = package.title or package.name %} {% set notes = h.markdown_extract(package.notes, extract_length=truncate) %} -{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} - -{% set showcase_read_route = 'showcase_blueprint.read' if ckan_29_or_higher else 'showcase_read' %} +{% set showcase_read_route = 'showcase_blueprint.read' %} {% block package_item %} diff --git a/ckanext/showcase/templates/showcase/snippets/tags.html b/ckanext/showcase/templates/showcase/snippets/tags.html index dae2e08e..8b60fa2d 100644 --- a/ckanext/showcase/templates/showcase/snippets/tags.html +++ b/ckanext/showcase/templates/showcase/snippets/tags.html @@ -1,6 +1,5 @@ {% if tags %} - {% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %} - {% set showcase_index_route = 'showcase_blueprint.index' if ckan_29_or_higher else 'showcase_index' %} + {% set showcase_index_route = 'showcase_blueprint.index' %}
    {% set _class = 'tag-list well' %} From e12a275f33758fdd3e2b48597c4023626f82cf9a Mon Sep 17 00:00:00 2001 From: pdelboca Date: Tue, 14 Feb 2023 09:12:09 -0300 Subject: [PATCH 55/77] Migrate static logic to assets --- .../showcase/{fanstatic => assets}/ckanext_showcase.css | 0 .../{fanstatic => assets}/ckeditor-content-style.css | 0 ckanext/showcase/{fanstatic => assets}/dist/ckeditor.js | 0 .../{fanstatic => assets}/js/showcase-ckeditor.js | 0 ckanext/showcase/{fanstatic => assets}/src/ckeditor.js | 0 ckanext/showcase/{fanstatic => assets}/webassets.yml | 0 ckanext/showcase/fanstatic/resource.config | 8 -------- ckanext/showcase/plugin.py | 2 +- ckanext/showcase/templates/showcase/edit_base.html | 3 +-- ckanext/showcase/templates/showcase/manage_datasets.html | 4 ++-- ckanext/showcase/templates/showcase/new_package_form.html | 3 +-- ckanext/showcase/templates/showcase/read.html | 5 ++--- .../templates/showcase/snippets/ckeditor_asset.html | 1 - .../showcase/snippets/ckeditor_content_css_asset.html | 1 - .../showcase/snippets/ckeditor_content_css_resource.html | 1 - .../templates/showcase/snippets/ckeditor_resource.html | 1 - .../templates/showcase/snippets/showcase_css_asset.html | 1 - .../showcase/snippets/showcase_css_resource.html | 1 - .../templates/showcase/snippets/showcase_info.html | 2 +- 19 files changed, 8 insertions(+), 25 deletions(-) rename ckanext/showcase/{fanstatic => assets}/ckanext_showcase.css (100%) rename ckanext/showcase/{fanstatic => assets}/ckeditor-content-style.css (100%) rename ckanext/showcase/{fanstatic => assets}/dist/ckeditor.js (100%) rename ckanext/showcase/{fanstatic => assets}/js/showcase-ckeditor.js (100%) rename ckanext/showcase/{fanstatic => assets}/src/ckeditor.js (100%) rename ckanext/showcase/{fanstatic => assets}/webassets.yml (100%) delete mode 100644 ckanext/showcase/fanstatic/resource.config delete mode 100644 ckanext/showcase/templates/showcase/snippets/ckeditor_asset.html delete mode 100644 ckanext/showcase/templates/showcase/snippets/ckeditor_content_css_asset.html delete mode 100644 ckanext/showcase/templates/showcase/snippets/ckeditor_content_css_resource.html delete mode 100644 ckanext/showcase/templates/showcase/snippets/ckeditor_resource.html delete mode 100644 ckanext/showcase/templates/showcase/snippets/showcase_css_asset.html delete mode 100644 ckanext/showcase/templates/showcase/snippets/showcase_css_resource.html diff --git a/ckanext/showcase/fanstatic/ckanext_showcase.css b/ckanext/showcase/assets/ckanext_showcase.css similarity index 100% rename from ckanext/showcase/fanstatic/ckanext_showcase.css rename to ckanext/showcase/assets/ckanext_showcase.css diff --git a/ckanext/showcase/fanstatic/ckeditor-content-style.css b/ckanext/showcase/assets/ckeditor-content-style.css similarity index 100% rename from ckanext/showcase/fanstatic/ckeditor-content-style.css rename to ckanext/showcase/assets/ckeditor-content-style.css diff --git a/ckanext/showcase/fanstatic/dist/ckeditor.js b/ckanext/showcase/assets/dist/ckeditor.js similarity index 100% rename from ckanext/showcase/fanstatic/dist/ckeditor.js rename to ckanext/showcase/assets/dist/ckeditor.js diff --git a/ckanext/showcase/fanstatic/js/showcase-ckeditor.js b/ckanext/showcase/assets/js/showcase-ckeditor.js similarity index 100% rename from ckanext/showcase/fanstatic/js/showcase-ckeditor.js rename to ckanext/showcase/assets/js/showcase-ckeditor.js diff --git a/ckanext/showcase/fanstatic/src/ckeditor.js b/ckanext/showcase/assets/src/ckeditor.js similarity index 100% rename from ckanext/showcase/fanstatic/src/ckeditor.js rename to ckanext/showcase/assets/src/ckeditor.js diff --git a/ckanext/showcase/fanstatic/webassets.yml b/ckanext/showcase/assets/webassets.yml similarity index 100% rename from ckanext/showcase/fanstatic/webassets.yml rename to ckanext/showcase/assets/webassets.yml diff --git a/ckanext/showcase/fanstatic/resource.config b/ckanext/showcase/fanstatic/resource.config deleted file mode 100644 index 07a8ea2a..00000000 --- a/ckanext/showcase/fanstatic/resource.config +++ /dev/null @@ -1,8 +0,0 @@ -[depends] - -ckeditor = base/main - -[groups] -ckeditor = - dist/ckeditor.js - js/showcase-ckeditor.js diff --git a/ckanext/showcase/plugin.py b/ckanext/showcase/plugin.py index 83ef7bb3..882c455b 100644 --- a/ckanext/showcase/plugin.py +++ b/ckanext/showcase/plugin.py @@ -55,7 +55,7 @@ def get_commands(self): def update_config(self, config): tk.add_template_directory(config, 'templates') tk.add_public_directory(config, 'public') - tk.add_resource('fanstatic', 'showcase') + tk.add_resource('assets', 'showcase') tk.add_ckan_admin_tab(config, 'showcase_blueprint.admins', 'Showcase Config') # IConfigurable diff --git a/ckanext/showcase/templates/showcase/edit_base.html b/ckanext/showcase/templates/showcase/edit_base.html index e690d51e..6e25d8ed 100644 --- a/ckanext/showcase/templates/showcase/edit_base.html +++ b/ckanext/showcase/templates/showcase/edit_base.html @@ -13,8 +13,7 @@ {% block styles %} {{ super() }} - {% set _type = 'asset' if h.ckan_version().split('.')[1] | int >= 9 else 'resource' %} - {% snippet 'showcase/snippets/showcase_css_' ~ _type ~ '.html' %} + {% asset "showcase/ckanext-showcase-css" %} {% endblock %} {% block breadcrumb_content_selected %}{% endblock %} diff --git a/ckanext/showcase/templates/showcase/manage_datasets.html b/ckanext/showcase/templates/showcase/manage_datasets.html index b1da5c6e..4b408624 100644 --- a/ckanext/showcase/templates/showcase/manage_datasets.html +++ b/ckanext/showcase/templates/showcase/manage_datasets.html @@ -66,7 +66,7 @@

    {{ _('Datasets available to add to this showcase') }}

    - {{ h.link_to(title|truncate(truncate_title), h.url_for(controller='dataset' if h.ckan_version().split('.')[1] | int >= 9 else 'package', action='read', id=package.name)) }} + {{ h.link_to(title|truncate(truncate_title), h.url_for('dataset.read', id=package.name)) }}

    {% if notes %}

    {{ notes|urlize }}

    @@ -124,7 +124,7 @@

    {{ _('Datasets in this showcase') }}

    - {{ h.link_to(title|truncate(truncate_title), h.url_for(controller='dataset' if h.ckan_version().split('.')[1] | int >= 9 else 'package', action='read', id=package.name)) }} + {{ h.link_to(title|truncate(truncate_title), h.url_for('dataset.read', id=package.name)) }}

    {% if notes %}

    {{ notes|urlize }}

    diff --git a/ckanext/showcase/templates/showcase/new_package_form.html b/ckanext/showcase/templates/showcase/new_package_form.html index e5e1a447..9d2985bc 100644 --- a/ckanext/showcase/templates/showcase/new_package_form.html +++ b/ckanext/showcase/templates/showcase/new_package_form.html @@ -30,8 +30,7 @@ {% block package_basic_fields_description %} {% set editor = h.get_wysiwyg_editor() %} {% if editor == 'ckeditor' %} - {% set _type = 'asset' if h.ckan_version().split('.')[1] | int >= 9 else 'resource' %} - {% snippet 'showcase/snippets/ckeditor_' ~ _type ~ '.html' %} + {% asset 'showcase/ckeditor' %} {% set ckeditor_attrs = { 'data-module': 'showcase-ckeditor', diff --git a/ckanext/showcase/templates/showcase/read.html b/ckanext/showcase/templates/showcase/read.html index fb951514..a2436f2b 100644 --- a/ckanext/showcase/templates/showcase/read.html +++ b/ckanext/showcase/templates/showcase/read.html @@ -12,10 +12,9 @@ {% block styles %} {{ super() }} - {% set _type = 'asset' if h.ckan_version().split('.')[1] | int >= 9 else 'resource' %} - {% snippet 'showcase/snippets/showcase_css_' ~ _type ~ '.html' %} + {% asset "showcase/ckanext-showcase-css" %} {% if editor == 'ckeditor' %} - {% snippet 'showcase/snippets/ckeditor_content_css_' ~ _type ~ '.html' %} + {% asset 'showcase/ckeditor' %} {% endif %} {% endblock %} diff --git a/ckanext/showcase/templates/showcase/snippets/ckeditor_asset.html b/ckanext/showcase/templates/showcase/snippets/ckeditor_asset.html deleted file mode 100644 index 732e7e92..00000000 --- a/ckanext/showcase/templates/showcase/snippets/ckeditor_asset.html +++ /dev/null @@ -1 +0,0 @@ -{% asset 'showcase/ckeditor' %} diff --git a/ckanext/showcase/templates/showcase/snippets/ckeditor_content_css_asset.html b/ckanext/showcase/templates/showcase/snippets/ckeditor_content_css_asset.html deleted file mode 100644 index d3bc8c9c..00000000 --- a/ckanext/showcase/templates/showcase/snippets/ckeditor_content_css_asset.html +++ /dev/null @@ -1 +0,0 @@ -{% asset "showcase/ckeditor-content-css" %} \ No newline at end of file diff --git a/ckanext/showcase/templates/showcase/snippets/ckeditor_content_css_resource.html b/ckanext/showcase/templates/showcase/snippets/ckeditor_content_css_resource.html deleted file mode 100644 index 57ef2812..00000000 --- a/ckanext/showcase/templates/showcase/snippets/ckeditor_content_css_resource.html +++ /dev/null @@ -1 +0,0 @@ -{% resource "showcase/ckeditor-content-style.css" %} \ No newline at end of file diff --git a/ckanext/showcase/templates/showcase/snippets/ckeditor_resource.html b/ckanext/showcase/templates/showcase/snippets/ckeditor_resource.html deleted file mode 100644 index 8a65271b..00000000 --- a/ckanext/showcase/templates/showcase/snippets/ckeditor_resource.html +++ /dev/null @@ -1 +0,0 @@ -{% resource 'showcase/ckeditor' %} diff --git a/ckanext/showcase/templates/showcase/snippets/showcase_css_asset.html b/ckanext/showcase/templates/showcase/snippets/showcase_css_asset.html deleted file mode 100644 index a7c6dabe..00000000 --- a/ckanext/showcase/templates/showcase/snippets/showcase_css_asset.html +++ /dev/null @@ -1 +0,0 @@ -{% asset "showcase/ckanext-showcase-css" %} \ No newline at end of file diff --git a/ckanext/showcase/templates/showcase/snippets/showcase_css_resource.html b/ckanext/showcase/templates/showcase/snippets/showcase_css_resource.html deleted file mode 100644 index dee33209..00000000 --- a/ckanext/showcase/templates/showcase/snippets/showcase_css_resource.html +++ /dev/null @@ -1 +0,0 @@ -{% resource "showcase/ckanext_showcase.css" %} \ No newline at end of file diff --git a/ckanext/showcase/templates/showcase/snippets/showcase_info.html b/ckanext/showcase/templates/showcase/snippets/showcase_info.html index fb1e3a0f..4b8f7b2a 100644 --- a/ckanext/showcase/templates/showcase/snippets/showcase_info.html +++ b/ckanext/showcase/templates/showcase/snippets/showcase_info.html @@ -40,7 +40,7 @@

    {{ h.link_to(title|truncate(truncate_title), h.url_for(controller='dataset' if h.ckan_version().split('.')[1] | int >= 9 else 'package', action='read', id=package.name)) }}

  • + {% endfor %}
{% else %} From ac1ec04048828b75c94d111570170ef4179806a1 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Tue, 14 Feb 2023 09:58:53 -0300 Subject: [PATCH 56/77] Fix search endpoint --- ckanext/showcase/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ckanext/showcase/utils.py b/ckanext/showcase/utils.py index ec269da1..f982f4fc 100644 --- a/ckanext/showcase/utils.py +++ b/ckanext/showcase/utils.py @@ -380,7 +380,7 @@ def pager_url(q=None, page=None): def _search_url(params, name): - url = h.url_for('showcase_manage_datasets', id=name) + url = h.url_for('showcase_blueprint.manage_datasets', id=name) return url_with_params(url, params) From 7157c153a75301ca04c850a3d78d7469933d5d48 Mon Sep 17 00:00:00 2001 From: pdelboca Date: Tue, 14 Feb 2023 10:29:08 -0300 Subject: [PATCH 57/77] Refactor test for 2.9/2.10 support --- ckanext/showcase/tests/test_plugin.py | 110 ++++++++------------------ 1 file changed, 34 insertions(+), 76 deletions(-) diff --git a/ckanext/showcase/tests/test_plugin.py b/ckanext/showcase/tests/test_plugin.py index 9bddd790..6a1b2271 100644 --- a/ckanext/showcase/tests/test_plugin.py +++ b/ckanext/showcase/tests/test_plugin.py @@ -42,39 +42,30 @@ def test_showcase_create_form_renders(self, app): def test_showcase_new_redirects_to_manage_datasets(self, app): """Creating a new showcase redirects to the manage datasets form.""" - if tk.check_ckan_version("2.9"): - pytest.skip("submit_and_follow not supported") - sysadmin = factories.Sysadmin() # need a dataset for the 'bulk_action.showcase_add' button to show factories.Dataset() env = {"REMOTE_USER": sysadmin["name"].encode("ascii")} - response = app.get(url=url_for("showcase_new"), extra_environ=env,) - - # create showcase - form = response.forms["dataset-edit"] - form["name"] = u"my-showcase" - create_response = helpers.submit_and_follow(app, form, env, "save") + response = app.post( + url=url_for("showcase_blueprint.new"), + extra_environ=env, + data={"name": "my-showcase"}, + follow_redirects=False + ) - # Unique to manage_datasets page - assert "bulk_action.showcase_add" in create_response # Requested page is the manage_datasets url. assert ( - url_for("showcase_manage_datasets", id="my-showcase") - == create_response.request.path + url_for("showcase_blueprint.manage_datasets", id="my-showcase") + in response.location ) def test_create_showcase(self, app): - if not tk.check_ckan_version(min_version='2.9.0'): - # Remove when dropping support for 2.8 - pytest.skip("data argument not supported in post()") - sysadmin = factories.Sysadmin() env = {"REMOTE_USER": sysadmin["name"].encode("ascii")} app.post( - url=url_for("showcase_new"), + url=url_for("showcase_blueprint.new"), extra_environ=env, data={ "name": "my-test-showcase", @@ -84,7 +75,7 @@ def test_create_showcase(self, app): ) res = app.get( - url=url_for("showcase_read", id="my-test-showcase"), + url=url_for("showcase_blueprint.read", id="my-test-showcase"), extra_environ=env, ) assert "my-test-showcase" in res.body @@ -133,16 +124,12 @@ def test_showcase_edit_redirects_to_showcase_details(self, app): ) def test_edit_showcase(self, app): - if not tk.check_ckan_version(min_version='2.9.0'): - # Remove when dropping support for 2.8 - pytest.skip("data argument not supported in post()") - sysadmin = factories.Sysadmin() factories.Dataset(name="my-showcase", type="showcase") env = {"REMOTE_USER": sysadmin["name"]} app.post( - url=url_for("showcase_edit", id="my-showcase"), + url=url_for("showcase_blueprint.edit", id="my-showcase"), extra_environ=env, data={ "name": "my-edited-showcase", @@ -151,7 +138,7 @@ def test_edit_showcase(self, app): } ) res = app.get( - url=url_for("showcase_edit", id="my-edited-showcase"), + url=url_for("showcase_blueprint.edit", id="my-edited-showcase"), extra_environ=env, ) assert "my-edited-showcase" in res.body @@ -170,12 +157,8 @@ def test_dataset_read_has_showcases_tab(self, app): dataset = factories.Dataset(name="my-dataset") - if tk.check_ckan_version("2.9"): - url = url = url_for("dataset.read", id=dataset["id"]) - else: - url = url_for( - controller="package", action="read", id=dataset["id"] - ) + url = url = url_for("dataset.read", id=dataset["id"]) + response = app.get(url) # response contains link to dataset's showcase list assert "/dataset/showcases/{0}".format(dataset["name"]) in response @@ -243,9 +226,6 @@ def test_dataset_showcase_page_add_to_showcase_dropdown_list(self, app): Add to showcase dropdown only lists showcases that aren't already associated with dataset. """ - if tk.check_ckan_version("2.9"): - pytest.skip("submit_and_follow not supported") - sysadmin = factories.Sysadmin() dataset = factories.Dataset(name="my-dataset") showcase_one = factories.Dataset( @@ -267,19 +247,15 @@ def test_dataset_showcase_page_add_to_showcase_dropdown_list(self, app): ) response = app.get( - url=url_for("showcase_dataset_showcase_list", id=dataset["id"]), + url=url_for("showcase_blueprint.dataset_showcase_list", id=dataset["id"]), extra_environ={"REMOTE_USER": str(sysadmin["name"])}, ) - showcase_add_form = response.forms["showcase-add"] - showcase_added_options = [ - value for (value, _) in showcase_add_form["showcase_added"].options - ] - assert showcase_one["id"] not in showcase_added_options - assert showcase_two["id"] in showcase_added_options - assert showcase_three["id"] in showcase_added_options + assert f'